次のコードで、Pickleを使用して保存したいNumpy配列(130,000 x 3)を取得しました。しかし、pkl.load行で「EOFError:Ran out of input」または「UnsupportedOperation:read」というエラーが引き続き発生します。 Pickleを使用するのはこれが初めてですが、アイデアはありますか?
おかげで、
アリ
import pickle as pkl
import numpy as np
arrayInput = np.zeros((1000,2)) #Trial input
save = True
load = True
filename = path + 'CNN_Input'
fileObject = open(fileName, 'wb')
if save:
pkl.dump(arrayInput, fileObject)
fileObject.close()
if load:
fileObject2 = open(fileName, 'wb')
modelInput = pkl.load(fileObject2)
fileObject2.close()
if arrayInput == modelInput:
Print(True)
numpy.save および numpy.load を使用する必要があります。
pickle
を使用しても問題ありません:
In [126]: arr = np.zeros((1000,2))
In [127]: with open('test.pkl','wb') as f:
...: pickle.dump(arr, f)
...:
In [128]: with open('test.pkl','rb') as f:
...: x = pickle.load(f)
...: print(x.shape)
...:
...:
(1000, 2)
pickle
とnp.save/load
には深い相互関係があります。このピクルをnp.load
でロードできるように:
In [129]: np.load('test.pkl').shape
Out[129]: (1000, 2)
間違ってピクルファイルを開くと、エラーが発生します。
In [130]: with open('test.pkl','wb') as f:
...: x = pickle.load(f)
...: print(x.shape)
...:
UnsupportedOperation: read
しかし、それは驚くべきことではありません-新しく開いた書き込みファイルを読み取ることはできません。空になります。
np.save/load
は、numpy配列を記述するための通常のペアです。ただし、pickleはsave
を使用して配列をシリアル化し、save
はpickleを使用して非配列オブジェクト(配列内)をシリアル化します。結果のファイルサイズは似ています。不思議なことに、ピクルスバージョンの方が高速です。
それは少しでしたが、これを見つけている場合、ピクルスはほんの少しの時間で完了します。
with open('filename','wb') as f: pickle.dump(arrayname, f)
with open('filename','rb') as f: arrayname1 = pickle.load(f)
numpy.array_equal(arrayname,arrayname1) #sanity check
一方、デフォルトでは、numpy compressは5.2GBを.4GBに、Pickleは1.7GBになりました。
Numpy行列を保存するには、numpy.save()
を使用する必要があります。