我处理不同形状的数组,我想用numpy.save
保存它们,所以,请考虑我有
mat1 = numpy.arange(8).reshape(4, 2)
mat2 = numpy.arange(9).reshape(2, 3)
numpy.save('mat.npy', numpy.array([mat1, mat2]))
有效。但是当我有两个尺寸相同的矩阵时,它就不起作用了。
mat1 = numpy.arange(8).reshape(2, 4)
mat2 = numpy.arange(10).reshape(2, 5)
numpy.save('mat.npy', numpy.array([mat1, mat2]))
它导致
Traceback (most recent call last):
File "<input>", line 1, in <module>
ValueError: could not broadcast input array from shape (2,4) into shape (2)
请注意numpy.array([mat1, mat2])
而不是numpy.save
我知道这样的阵列是可能的:
>> numpy.array([[[1, 2]], [[1, 2], [3, 4]]])
array([[[1, 2]], [[1, 2], [3, 4]]], dtype=object)
所以,我想要的是将两个数组同时保存为mat1
和mat2
。
答案 0 :(得分:20)
如果您想以与np.save
相同的格式保存多个数组,请使用np.savez
。
例如:
import numpy as np
arr1 = np.arange(8).reshape(2, 4)
arr2 = np.arange(10).reshape(2, 5)
np.savez('mat.npz', name1=arr1, name2=arr2)
data = np.load('mat.npz')
print data['name1']
print data['name2']
如果您有多个数组,则可以展开参数:
import numpy as np
data = [np.arange(8).reshape(2, 4), np.arange(10).reshape(2, 5)]
np.savez('mat.npz', *data)
container = np.load('mat.npz')
data = [container[key] for key in container]
请注意,订单不会保留。如果您确实需要保留订单,则可以考虑改为使用pickle
。
如果使用pickle
,请务必指定二进制协议,否则您将使用ascii pickle编写内容,这对于numpy数组来说效率特别低。使用二进制协议时,ndarray
或多或少的pickle采用与np.save
/ np.savez
相同的格式。例如:
# Note: This is Python2.x specific. It's identical except for the import on 3.x
import cPickle as pickle
import numpy as np
data = [np.arange(8).reshape(2, 4), np.arange(10).reshape(2, 5)]
with open('mat.pkl', 'wb') as outfile:
pickle.dump(data, outfile, pickle.HIGHEST_PROTOCOL)
with open('mat.pkl', 'rb') as infile:
result = pickle.load(infile)
在这种情况下,result
和data
将具有相同的内容,并且将保留数组输入列表的顺序。