--numpy 1.16.3 oder höher
Python-Codebeispiel
np.load('/path/to/file.npy')
Beispiele für auftretende Fehler
---------------------------------------------------------------------------
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
Seit numpy v1.16.3
hat sich das Verhalten der Funktion numpy.load ()
geändert.
Vorher ändern | Nach der veränderung |
---|---|
allow_pickle Der Standardwert für die Option istTrue |
allow_pickle Der Standardwert für die Option istFalse |
Nachdem Sie bestätigt haben, dass keine ** Sicherheitsbedenken ** vorliegen, die später beschrieben werden, geben Sie die Option allow_pickle
an, wie unten gezeigt.
np.load('/path/to/file.npy', allow_pickle=True)
dtype
Die Numpy-Matrix (np.ndarray
) kann nicht nur Zahlen, sondern auch Zeichenfolgen und Python-Objekte speichern. Der Typ des gespeicherten Werts spiegelt sich im Attribut "dtype" wider.
numpy v1.16.0
Es wurde eine Sicherheitsanfälligkeit gemeldet, durch die bösartiger Code ausgeführt werden kann, wenn eine Numpy-Matrix (eine serialisierte Datei) mit Python-Objekten mit np.load ()
serialisiert wird. (Es gibt jedoch ein Gegenargument zu dieser Sicherheitsanfälligkeit.)
Daher wird ab "v1.16.3" das Standardverhalten von "np.load ()" wie oben beschrieben geändert. Wenn "dtype" ein Python-Objekt ist und "allow_pickle = False", wird "ValueError" ausgelöst. Es war so. Es kann gesagt werden, dass es eine Spezifikationsänderung ist, um es auf die sicherere Seite zu bringen.
Natürlich nicht "np.load (allow_pickle = True)" für ** nicht vertrauenswürdige Dateien **. Wie im vorherigen Abschnitt erwähnt, ist es möglich, beliebigen Code auszuführen.
Es gibt normalerweise kein Problem mit Ad-hoc-Code wie der Datenformatierung durch Jupyter und dem maschinellen Lernen [^ 1]. Beachten Sie, dass Anwendungsentwickler Python verwenden.
[^ 1]: Es liegt ein Problem mit der Datei "* .npy" vor, die von einem böswilligen Kollegen (?) Angegeben wurde.
Es ändert das Verhalten der Anwendung, daher denke ich, dass es sich um eine Breaking Change handelt (Änderung, die nicht abwärtskompatibel ist).
In der numerischen Berechnungsbibliothek von Python besteht möglicherweise die Tendenz, sicher zu sein, wenn der Standardwert geändert wird. [^ 2] Wenn du denkst, dass es in Ordnung ist, weil es sich um ein Revisions-Upgrade handelt, wird es weh tun. Seien Sie vorsichtig bei Anwendungstechnikern, die aus anderen Sprachen eingegeben haben.
[^ 2]: Andere Beispiele sind der Standardwert von "n_estimator" in "sklearn.ensemble.RandomForestClassifier".
Recommended Posts