[PYTHON] Que faire si ʻObject arrays ne peut pas être chargé quand allow_pickle = False` se produit dans numpy.load ()

--numpy 1.16.3 ou version ultérieure

phénomène

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

Cause

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

Solution

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)

Commentaire

matrice numpy et 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».

Vulnérabilité dans 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.

Problèmes de sécurité

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.

Exemple NG
`np.load (allow_pickle)` pour les fichiers téléchargés par les utilisateurs
Exemple OK
`np.load (allow_pickle)` le fichier sérialisé dans le système

[^ 1]: Il y a un problème avec le fichier * .npy fourni par un collègue malveillant (?).

N'est-ce pas un changement radical?

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

Que faire si ʻObject arrays ne peut pas être chargé quand allow_pickle = False` se produit dans numpy.load ()
Que faire si pip ne peut pas être installé
Que faire si une erreur de décodage Unicode se produit dans pip
Que faire si la dépendance du package ne peut pas être réparée
Que faire si une erreur 0xC0000005 se produit dans tf.train.start_queue_runners ()
Que faire lorsqu'une vidéo ne peut pas être lue par cv2.VideoCapture
Que faire si PyAudio ne peut pas être installé sur Python 3.7, 3.8, 3.9 sous Windows
Que faire quand UnicodeDecodeError se produit pendant read_csv dans pandas (pd.read_table ())
Que faire lorsque ModuleNotFoundError: Aucun module nommé'XXX 'ne se produit en Python
Que faire si une erreur se produit lors de l'importation de numpy avec VScode
[OSX] [pyenv] Que faire lorsqu'une erreur SSL se produit dans pip
Que faire si pipreqs aboutit à UnicodeDecodeError
Que faire si mod_fcgid ne peut pas résoudre UnicodeEncodeError
Que faire quand une PermissionError dans tempfile.mkstemp se produit
Que faire si CERTIFICATE_VERIFY_FAILED se produit lorsque nltk.download () est effectué sur macOS pyhon
[python] Que faire si vous obtenez une erreur avec send_keys dans le chrome sans tête
Que faire lorsqu'une erreur SSL se produit avec pip dans l'environnement Windows10, miniconda, VScode
Que faire si une erreur de codage Unicode se produit dans Sublime Text Python
Que faire si l'abandon s'affiche lors de la saisie d'une vidéo de caméra dans OpenCV
Que faire si l'installation de pip échoue dans Xcode 5.1
[openpyxl] Que faire lorsque IllegalCharacterError apparaît dans pandas.DataFrame.to_excel
Que faire lorsque "impossible d'importer le nom xxx" [Python]
Que faire quand n'est pas dans le fichier sudoers. Cet incident sera signalé.
Que faire si pvcreate produit beaucoup d'AVERTISSEMENT et ne peut pas être créé
Que faire si vous obtenez une erreur lors de l'importation de matplotlib en Python (Mac)
Que faire lorsque ʻarguments [0] .scrollIntoView (); `échoue dans python sélénium
Que faire si pip donne une DistributionError dans Homebrew
Que faire lorsqu'une erreur de suppression se produit lors de la mise à jour de conda
Que faire lorsqu'un artefact manquant se produit dans un fichier jar qui n'est pas défini dans pom.xml
Que faire si Combinaisons devient «couverture inconnue»
Que faire lorsqu'une erreur se produit avec import _ssl
Que faire si l'installation du package échoue lors du déploiement sur heroku
Que faire lorsque "SSL: CERTIFICATE_VERIFY_FAILED _ssl.c: 1056" apparaît en Python
Que faire lorsque "En-tête HTTP_HOST non valide" apparaît dans Django
Que faire si vous ne pouvez pas vous connecter en tant que root
Que faire si vous obtenez une erreur lors de l'exécution de "certbot renouveler" dans l'environnement CakePHP
Que faire si vous vous fâchez contre les `` déclarations '' doivent être une liste 2D ... dans la flèche matplotlib
[Pour les débutants en informatique] Que faire lorsque la commande rev ne peut pas être utilisée avec Git Bash
Que faire si vous obtenez une erreur indiquant que le compilateur C ne peut pas créer d'exécutables dans configure
Que faire si vous obtenez une erreur de remplacement obligatoire `get_config` lorsque vous essayez de model.save avec Keras
Que faire si vous obtenez moins zéro en Python
[Beanstalk] Que faire lorsqu'une erreur se produit avec import uuid
Mesures à prendre en cas d'opération suspecte dans la redirection HttpResponse
Que faire si un avertissement de plate-forme non sécurisée apparaît lors de l'exécution de Python
Que faire si «Sans nom: 0» est ajouté dans to_csv-> read_csv des pandas
Que faire si vous ne pouvez pas utiliser la poubelle dans Lubuntu 18.04.
Que faire lorsque le type de valeur est ambigu en Python?
Que faire quand Ubuntu plante
Que faire si yum casse
Que faire si vous recevez le message "" ~ .pkg "est corrompu et ne peut pas être ouvert" lors de l'installation de wxPython sur Mac OS X
Que faire si vous obtenez "La session n'a pas pu être ouverte" lors de l'installation de CentOS sur VirtualBox
[Django] Que faire lorsqu'une erreur d'intégrité se produit lors de l'enregistrement des données du site de gestion dans la base de données
Que faire s'il y a un décimal dans python json .dumps
Que faire lorsque le résultat téléchargé via scrapy est en anglais
Que faire si PDO n'est pas trouvé dans Laravel ou CakePHP
Que faire si vous ne pouvez pas utiliser la recherche de grille de sklearn en Python
Que faire si vous vous perdez dans la référence de fichier avec FileNotFoundError