【问题标题】:NumPy save some arrays at onceNumPy 一次保存一些数组
【发布时间】:2016-02-01 14:41:27
【问题描述】:

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

【问题讨论】:

  • 您是否考虑过使用np.savez 或使用二进制协议来代替pickle? savez 保存多个数组,save 只保存一个数组。
  • 它可以在我的电脑上运行。你用的是什么版本的python?
  • 如果mat1mat2的第一个维度相同,np.array(...)会产生这个错误。您可以通过初始化np.empty((2,),object) 数组并用元素数组填充它来解决此错误。如果所有维度都相同(以防止串联),也可以这样做。

标签: python arrays numpy


【解决方案1】:

如果您想以与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 数组特别低效。使用二进制协议,ndarrays 或多或少地腌制为与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 将具有相同的内容,并且将保留输入数组列表的顺序。

【讨论】:

  • 考虑我有数组列表,我想将它们全部保存,然后再加载。
  • 另外……我写的一般问题有解决方案吗?
  • @Dubon - 我不太确定您所说的“一般问题”指的是什么。如果您的意思是从磁盘写入/读取任意 python 对象,pickle 就是您要查找的内容。
  • @Dubon - 你得到一个对象数组。在与其他数组相同的意义上,它不是一个“真正的”数组。这基本上是一个非常低效的list。您最好使用list 而不是创建对象数组。正如您所指出的,此特定结果是其他数组的 1D 数组。它不会像 2D 或 3D 数组那样广播,因为它是 1D 的。您也将无法以完全相同的方式使用数学运算(或者更确切地说,您会遇到一些令人讨厌的惊喜)。如果您对numpy 还不是很熟悉,请不要使用对象数组。
  • 补充 Joe 的评论,看看为什么他说 这不是一个与其他人一样的“真实”数组,请参阅 this。跨度>
猜你喜欢
  • 1970-01-01
  • 2021-03-04
  • 2013-09-09
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多