web-dev-qa-db-ja.com

Pickleを使用してNumpy配列を保存

次のコードで、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)
7
Anant

numpy.save および numpy.load を使用する必要があります。

18
piokuc

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)

picklenp.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を使用して非配列オブジェクト(配列内)をシリアル化します。結果のファイルサイズは似ています。不思議なことに、ピクルスバージョンの方が高速です。

7
hpaulj

それは少しでしたが、これを見つけている場合、ピクルスはほんの少しの時間で完了します。

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になりました。

1
TomF

Numpy行列を保存するには、numpy.save()を使用する必要があります。

0
Lucky Suman