NumPy在上保存一些数组

2024-04-25 11:22:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我处理不同形状的数组,我想用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)

所以,我想要的是同时将两个数组保存为mat1mat2


Tags: numpyinputsave矩阵数组array形状shape
1条回答
网友
1楼 · 发布于 2024-04-25 11:22:22

如果要以与^{}相同的格式保存多个数组,请使用^{}

例如:

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)

在这种情况下,resultdata将具有相同的内容,并且将保留数组输入列表的顺序。

相关问题 更多 >