我有一个我想保存的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)
答案 0 :(得分:10)
您应该使用numpy.save和numpy.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)
pickle
和np.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。
简短原因:
np.save,np.load,np.savez
在大多数指标上都有相当不错的表现,请参见this,这是可以预期的,因为它是一个已建立的库,并且numpy的开发人员已经实现了这些功能。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)
save
和 load
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])