NumPy一次保存一些数组

Dub*_*bon 19 python arrays numpy

我正在研究不同形状的数组,我想将它们全部保存起来numpy.save,所以,请考虑一下

mat1 = numpy.arange(8).reshape(4, 2)
mat2 = numpy.arange(9).reshape(2, 3)
numpy.save('mat.npy', numpy.array([mat1, mat2]))
Run Code Online (Sandbox Code Playgroud)

有用.但是当我有两个尺寸相同的矩阵时,它就不起作用了.

mat1 = numpy.arange(8).reshape(2, 4)
mat2 = numpy.arange(10).reshape(2, 5)
numpy.save('mat.npy', numpy.array([mat1, mat2]))
Run Code Online (Sandbox Code Playgroud)

它导致
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一次.

Joe*_*ton 28

如果您想以与格式相同的格式保存多个数组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']
Run Code Online (Sandbox Code Playgroud)

如果您有多个数组,则可以展开参数:

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]
Run Code Online (Sandbox Code Playgroud)

请注意,订单不会保留.如果您确实需要保留订单,则可以考虑使用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)
Run Code Online (Sandbox Code Playgroud)

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

  • 考虑我有数组列表,我想全部保存它们,然后加载所有数组。 (2认同)
  • @Dubon - 你得到一个对象数组.它与其他阵列在同一意义上并不是一个"真正的"阵列.它基本上是一个非常低效的"列表".你最好使用`list`而不是创建一个对象数组.如您所述,此特定结果是其他数组的_1D_数组.它不会像2D或3D数组一样广播,因为它是1D.你也无法以完全相同的方式使用数学运算(或者更确切地说,你会遇到一些令人讨厌的惊喜).如果您还不熟悉`numpy`,请不要使用对象数组. (2认同)