使用Pickle保存Numpy数组

时间:2018-09-21 13:34:41

标签: python numpy pickle

我有一个我想保存的Numpy数组(130,000 x 3),我想用Pickle保存,并带有以下代码。但是,我在pkl.load行上不断收到错误“ EOFError:Ran out of input”或“ UnsupportedOperation:read”。这是我第一次使用Pickle,有什么想法吗?

谢谢

Anant

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 个答案:

答案 0 :(得分:10)

您应该使用numpy.savenumpy.load

答案 1 :(得分:3)

使用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)

如果我以错误的方式打开pickle文件,我会得到您的错误:

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来序列化非数组对象(在数组中)。结果文件大小相似。奇怪的是,泡菜版本的速度更快。

答案 2 :(得分:1)

有一点点,但是如果您发现了它,那么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。

答案 3 :(得分:0)

您应使用numpy.save()保存numpy矩阵。

答案 4 :(得分:0)

在您的代码中,您正在使用

if load:
    fileObject2 = open(fileName, 'wb')
    modelInput = pkl.load(fileObject2)
    fileObject2.close()

open函数中的第二个参数是方法。 w代表写作,r代表阅读。第二个字符b表示将读取/写入字节。无法读取将被写入的文件,反之亦然。因此,使用fileObject2 = open(fileName, 'rb')打开文件即可解决问题。

答案 5 :(得分:0)

不要对多个numpy数组使用pickle,进行扩展的讨论以链接到我可以找到的所有资源,请参见my answer here

简短原因:

  • 已经有一个不错的界面 numpy的开发人员,可以为您节省大量调试时间(最重要的原因
  • np.save,np.load,np.savez在大多数指标上都有相当不错的表现,请参见this,这是可以预期的,因为它是一个已建立的库,并且numpy的开发人员已经实现了这些功能。
  • Pickle执行任意代码,是一个安全问题
  • 要使用泡菜,您必须打开并归档,并且可能会出现导致错误的问题(例如,我不知道使用b,并且停止工作了,花了一些时间进行调试)
  • 如果您拒绝接受此建议,至少可以真正阐明您需要使用其他内容的原因。确保它在您的脑海中清晰可见。

如果已经存在解决方案,请不惜一切代价避免重复代码!

无论如何,这是我尝试过的所有界面,希望它可以节省某人的时间(可能是我未来的自我):

import numpy as np
import pickle
from pathlib import Path

path = Path('~/data/tmp/').expanduser()
path.mkdir(parents=True, exist_ok=True)

lb,ub = -1,1
num_samples = 5
x = np.random.uniform(low=lb,high=ub,size=(1,num_samples))
y = x**2 + x + 2

# using save (to npy), savez (to npz)
np.save(path/'x', x)
np.save(path/'y', y)
np.savez(path/'db', x=x, y=y)
with open(path/'db.pkl', 'wb') as db_file:
    pickle.dump(obj={'x':x, 'y':y}, file=db_file)

## using loading npy, npz files
x_loaded = np.load(path/'x.npy')
y_load = np.load(path/'y.npy')
db = np.load(path/'db.npz')
with open(path/'db.pkl', 'rb') as db_file:
    db_pkl = pickle.load(db_file)

print(x is x_loaded)
print(x == x_loaded)
print(x == db['x'])
print(x == db_pkl['x'])
print('done')

但最有用的方法是查看我的答案here

答案 6 :(得分:0)

saveload NumPy 数组的最简单方法 -

# a numpy array

result.importances_mean
array([-1.43651529e-03, -2.73401297e-03,  9.26784059e-05, -7.41427247e-04,
        3.56811863e-03,  2.78035218e-03,  3.70713624e-03,  5.51436515e-03,
        1.16821131e-01,  9.26784059e-05,  9.26784059e-04, -1.80722892e-03,
       -1.71455051e-03, -1.29749768e-03, -9.26784059e-05, -1.43651529e-03,
        0.00000000e+00, -1.11214087e-03, -4.63392030e-05, -4.63392030e-04,
        1.20481928e-03,  5.42168675e-03, -5.56070436e-04,  8.34105653e-04,
       -1.85356812e-04,  0.00000000e+00, -9.73123262e-04, -1.43651529e-03,
       -1.76088971e-03])

# save the array format - np.save(filename.npy, array)

np.save(os.path.join(model_path, "permutation_imp.npy"), result.importances_mean)

# load the array format - np.load(filename.npy)

res = np.load(os.path.join(model_path, "permutation_imp.npy"))
res
array([-1.43651529e-03, -2.73401297e-03,  9.26784059e-05, -7.41427247e-04,
        3.56811863e-03,  2.78035218e-03,  3.70713624e-03,  5.51436515e-03,
        1.16821131e-01,  9.26784059e-05,  9.26784059e-04, -1.80722892e-03,
       -1.71455051e-03, -1.29749768e-03, -9.26784059e-05, -1.43651529e-03,
        0.00000000e+00, -1.11214087e-03, -4.63392030e-05, -4.63392030e-04,
        1.20481928e-03,  5.42168675e-03, -5.56070436e-04,  8.34105653e-04,
       -1.85356812e-04,  0.00000000e+00, -9.73123262e-04, -1.43651529e-03,
       -1.76088971e-03])