2017-01-17 8 views
6

NumPyのドキュメントhereによれば、デフォルトでマトリックスはallow_pickle=Trueで保存され、さらにこのデフォルト動作:NumPy: 'allow_pickle = False'で 'np.save()'を使用した場合の結果

allow_pickle:ブール、オプション
はPythonの漬物を使用してオブジェクト配列を保存できるようにします。 pickleを許可しない理由としては、セキュリティ(pickleされたデータをロードすると任意のコードを実行することができる)や移植性があります(pickleされたオブジェクトはPythonの異なるインストールではロードできません。 Python 2とPython 3)を使用しています。
デフォルト:true

それを読んだ後、私はもちろんallow_pickle=Falseを使用することを好むだろう - しかし、それはこの方法を使用する場合、それらは異なるが何であるかを教えてくれません。欠点にもかかわらず、デフォルトでallow_pickel=Trueを使用する何らかの理由があるはずです。

allow_pickle=Falseを使用するかどうかと、動作が異なるかどうかを教えてください。

+2

NumPyは非標準オブジェクトを保存するためにpickleモジュールを使用すると思いますので、標準のデータ型で動作するようにコードを制限します。 – abukaj

+0

興味深くて意味があります。つまり、NumPy配列内にインスタンスを保存するクラスがある場合、 'pickle'の使用を無効にすると、マトリックスの内容を保存することができなくなります。 – SalatYerakot

答えて

5

オブジェクト配列は通常のnumpy配列で、dtypeobjectです。これは、配列の内容が通常の数値型(intまたはfloatなど)でない場合に発生します。私たちはオブジェクトを使って数値の配列を保存してみることができます。オブジェクトの簡単な種類がdict次のようになります。

>>> import numpy as np 
>>> a = np.array([{x: 1} for x in range(4)]) 
>>> a 
array([{0: 1}, {1: 1}, {2: 1}, {3: 1}], dtype=object) 
>>> np.save('test.pkl', a) 

このバックが正常に動作ロード:

>>> np.load('test.pkl.npy') 
array([{0: 1}, {1: 1}, {2: 1}, {3: 1}], dtype=object) 

配列はしかし、ピクルスを使用せずに保存することはできません。

>>> np.save('test.pkl', a, allow_pickle=False) 
... 
ValueError: Object arrays cannot be saved when allow_pickle=False 

ピックルの大雑把なルールは、作成したピックルをロードする場合は安全ですが、他の場所から取得したピックルをロードする場合は注意が必要です。一つは、ピクルスの作成に使用したライブラリ(またはライブラリバージョン)がインストールされていない場合、ピクルスを読み込めない可能性があります(上記の移植性の意味です)。 セキュリティは別の潜在的な懸案事項です。例えば、this articleで漬け物がどのように悪用されるかについて少し読むことができます。

+0

も参照してください。doc https://docs.scipy.org/doc/numpy/neps/npy-format.html – bluss

関連する問題