--numpy 1.16.3 ou version ultérieure
Exemple de code Python
np.load('/path/to/file.npy')
Exemples d'erreurs qui se produisent
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-37-1db66562b57b> in <module>
----> 1 np.load('tmp.npy')
~/venv/aep/lib/python3.7/site-packages/numpy/lib/npyio.py in load(file, mmap_mode, allow_pickle, fix_imports, encoding)
451 else:
452 return format.read_array(fid, allow_pickle=allow_pickle,
--> 453 pickle_kwargs=pickle_kwargs)
454 else:
455 # Try a pickle
~/venv/aep/lib/python3.7/site-packages/numpy/lib/format.py in read_array(fp, allow_pickle, pickle_kwargs)
720 # The array contained Python objects. We need to unpickle the data.
721 if not allow_pickle:
--> 722 raise ValueError("Object arrays cannot be loaded when "
723 "allow_pickle=False")
724 if pickle_kwargs is None:
ValueError: Object arrays cannot be loaded when allow_pickle=False
Depuis numpy v1.16.3, le comportement de la fonction numpy.load () a changé.
| Changer avant | Après le changement |
|---|---|
allow_pickleLa valeur par défaut de l'option estTrue |
allow_pickleLa valeur par défaut de l'option estFalse |
Après avoir confirmé qu'il n'y a aucun ** problème de sécurité ** décrit plus tard, spécifiez l'option ʻallow_pickle` comme indiqué ci-dessous.
np.load('/path/to/file.npy', allow_pickle=True)
dtypeLa matrice numpy (np.ndarray) peut stocker non seulement des nombres mais aussi des chaînes et des objets Python. Le type de valeur stockée est reflété dans l'attribut «dtype».
numpy v1.16.0Une vulnérabilité a été signalée qui pourrait permettre l'exécution de code malveillant lors de la sérialisation d'une matrice numpy (un fichier sérialisé) contenant des objets Python avec np.load (). (Cependant, il existe un contre-argument concernant cette vulnérabilité)
Par conséquent, à partir de v1.16.3, le comportement par défaut de np.load () ʻest changé comme décrit ci-dessus, et quand dtype est un objet Python, ValueError est renvoyé si ʻallow_pickle = False. C'était moyen.
On peut dire qu'il s'agit d'un changement de spécification pour le pousser du côté le plus sûr.
Naturellement, ne pas np.load (allow_pickle = True) pour les ** fichiers non approuvés **. Comme mentionné dans la section précédente, il est possible d'exécuter du code arbitraire.
Il n'y a généralement aucun problème avec le code ad hoc tel que le formatage des données par Jupyter et l'apprentissage automatique [^ 1]. Notez que les développeurs d'applications utilisent Python.
[^ 1]: Il y a un problème avec le fichier * .npy fourni par un collègue malveillant (?).
Cela change le comportement de l'application, donc je pense que c'est un changement radical (changement qui n'est pas rétrocompatible).
Il peut y avoir une tendance dans la bibliothèque de calcul numérique de Python à être sûr si la valeur par défaut est modifiée. [^ 2] Si vous pensez que ça va parce que c'est une mise à jour de révision, ça va faire mal. Faites attention aux ingénieurs d'application qui sont entrés à partir d'autres langues.
[^ 2]: D'autres exemples incluent la valeur par défaut de n_estimator dans sklearn.ensemble.RandomForestClassifier.
Recommended Posts