[PYTHON] Was tun, wenn in numpy.load () "Objekt-Arrays nicht geladen werden können, wenn allow_pickle = False" auftritt?

--numpy 1.16.3 oder höher

Phänomen

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

Ursache

Seit numpy v1.16.3 hat sich das Verhalten der Funktion numpy.load () geändert.

Vorher ändern Nach der veränderung
allow_pickleDer Standardwert für die Option istTrue allow_pickleDer Standardwert für die Option istFalse

Lösungen

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)

Kommentar

Numpy Matrix und 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.

Sicherheitslücke in 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.

Sicherheitsbedenken

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.

NG-Beispiel
`np.load (allow_pickle)` für Dateien, die von Benutzern hochgeladen wurden
OK Beispiel
`np.load (allow_pickle)` die serialisierte Datei im System

[^ 1]: Es liegt ein Problem mit der Datei "* .npy" vor, die von einem böswilligen Kollegen (?) Angegeben wurde.

Ist das nicht eine bahnbrechende Veränderung?

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

Was tun, wenn in numpy.load () "Objekt-Arrays nicht geladen werden können, wenn allow_pickle = False" auftritt?
Was tun, wenn pip nicht installiert werden kann?
Was tun, wenn in pip ein Unicode-Dekodierungsfehler auftritt?
Was tun, wenn die Paketabhängigkeit nicht repariert werden kann?
Was tun, wenn in tf.train.start_queue_runners () ein 0xC0000005-Fehler auftritt?
Was tun, wenn ein Video von cv2.VideoCapture nicht gelesen werden kann?
Was tun, wenn PyAudio unter Python 3.7, 3.8, 3.9 unter Windows nicht installiert werden kann?
Was tun, wenn UnicodeDecodeError während read_csv in Pandas auftritt (pd.read_table ())
Was tun, wenn ModuleNotFoundError: In Python tritt kein Modul mit dem Namen 'XXX' auf
Was tun, wenn beim Importieren von numpy mit VScode ein Fehler auftritt?
[OSX] [pyenv] Was tun, wenn in pip ein SSL-Fehler auftritt?
Was tun, wenn pipreqs zu UnicodeDecodeError führt?
Was tun, wenn mod_fcgid UnicodeEncodeError nicht auflösen kann?
Was tun, wenn ein PermissionError in tempfile.mkstemp auftritt?
Was tun, wenn CERTIFICATE_VERIFY_FAILED auftritt, wenn nltk.download () unter macOS pyhon ausgeführt wird?
[Python] Was tun, wenn bei send_keys in Headless Chrome ein Fehler auftritt?
Was tun, wenn ein SSL-Fehler mit pip in einer Windows10-, Miniconda- oder VScode-Umgebung auftritt?
Was tun, wenn in Sublime Text Python ein Unicode-Codierungsfehler auftritt?
Was tun, wenn bei der Eingabe eines Kameravideos in OpenCV ein Abbruch angezeigt wird?
Was tun, wenn die Pip-Installation in Xcode 5.1 fehlschlägt?
[openpyxl] Was tun, wenn IllegalCharacterError in pandas.DataFrame.to_excel angezeigt wird?
Was tun, wenn "Name xxx nicht importiert werden kann" [Python]
Was zu tun ist, wenn es nicht in der Sudoers-Datei enthalten ist. Dieser Vorfall wird gemeldet.
Was tun, wenn pvcreate viel WARNUNG erzeugt und nicht erstellt werden kann?
Was tun, wenn beim Importieren von matplotlib in Python (Mac) eine Fehlermeldung angezeigt wird?
Was tun, wenn `Argumente [0] .scrollIntoView ();` in Python-Selen fehlschlägt?
Was tun, wenn pip in Homebrew einen DistributionError ausgibt?
Was tun, wenn beim Aktualisieren von conda ein Fehler beim Entfernen auftritt?
Was tun, wenn ein nicht in pom.xml definiertes Glas zu einem fehlenden Artefakt wird?
Was tun, wenn Overalls "Abdeckung unbekannt" werden?
Was tun, wenn beim Importieren von _ssl ein Fehler auftritt?
Was tun, wenn die Paketinstallation bei der Bereitstellung auf heroku fehlschlägt?
Was tun, wenn in Python "SSL: CERTIFICATE_VERIFY_FAILED _ssl.c: 1056" angezeigt wird?
Was tun, wenn in Django "Ungültiger HTTP_HOST-Header" angezeigt wird?
Was tun, wenn Sie sich nicht als root anmelden können?
Was tun, wenn beim Ausführen von "certbot erneuern" in der CakePHP-Umgebung eine Fehlermeldung angezeigt wird?
Was zu tun ist, wenn Sie sich über "Umkehrungen" ärgern, muss eine 2D-Liste sein ... im matplotlib-Pfeil
[Für IT-Anfänger] Was tun, wenn der Befehl rev nicht mit Git Bash verwendet werden kann?
Was tun, wenn die Fehlermeldung angezeigt wird, dass der c-Compiler in configure keine ausführbaren Dateien erstellen kann?
Was tun, wenn beim Versuch, model.save mit Keras zu modellieren, der Fehler "get_config" überschrieben werden muss?
Was tun, wenn in Python minus Null angezeigt wird?
[Beanstalk] Was tun, wenn beim Importieren der UUID ein Fehler auftritt?
Maßnahmen, die zu ergreifen sind, wenn in HttpResponse Redirect ein verdächtiger Vorgang auftritt
Was tun, wenn beim Ausführen von Python eine Warnung zur unsicheren Plattform angezeigt wird?
Was tun, wenn "Unbenannt: 0" in_csv-> read_csv von Pandas hinzugefügt wird?
Was tun, wenn Sie den Papierkorb in Lubuntu 18.04 nicht verwenden können?
Was tun, wenn der Werttyp in Python nicht eindeutig ist?
Was tun, wenn Ubuntu abstürzt?
Was tun, wenn Yum kaputt geht?
Was tun, wenn bei der Installation von wxPython unter Mac OS X die Meldung "~ .pkg" beschädigt wird und nicht geöffnet werden kann?
Was tun, wenn bei der Installation von CentOS auf VirtualBox die Meldung "Die Sitzung konnte nicht geöffnet werden" angezeigt wird
[Django] Was tun, wenn beim Registrieren von Daten von der Verwaltungssite in die Datenbank ein Integritätsfehler auftritt?
Was tun, wenn in python json .dumps eine Dezimalstelle enthalten ist?
Was tun, wenn das über Scrapy heruntergeladene Ergebnis auf Englisch ist?
Was tun, wenn PDO nicht in Laravel oder CakePHP gefunden wird?
Was tun, wenn Sie die Rastersuche von sklearn in Python nicht verwenden können?
Was tun, wenn Sie sich mit FileNotFoundError in der Dateireferenz verlieren?