--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_pickle La valeur par défaut de l'option estTrue |
allow_pickle La 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)
dtype
La 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.0
Une 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