Python 打包不同维度的 numpy 数组
我想在通过 np.save
保存 numpy 数组之前先把它们压缩起来。对于一维数组的压缩,我使用了
import numpy as np
a = np.ones(4) * 5.
b = np.ones(4) * 4.
data = np.array(zip(a, b))
这正好满足我的需求。现在我有更多的数据,比如说
c = numpy.ones((2, 4))
但是
data = np.array(zip(a, b, c))
这样就不行了。我可以这样做
data = np.array(zip(a, b, c[0], c[1]))
不过这样的话,c
的“深度”就会变化。我的解决方案是
data = np.insert(c, 0, b, axis=0)
data = np.insert(data, 0, a, axis=0)
data = zip(*data)
但这样读起来感觉不太好。感谢任何建议。
3 个回答
2
如果你只是想保存多个不同维度的数组,我不建议使用zip
。可以使用np.savez
或者np.savez_compressed
。这些函数专门用来保存多个数组(可以是任意维度的)。
使用zip
特别不推荐,因为它在Python3中返回的是一个迭代器,而不是一个元组列表。对这个迭代器调用np.array
会创建一个只有一个元素的数组,类型是object
,这可能不是你想要的结果。我在保存和加载后无法恢复被压缩的数据。
2
在调用 zip
时,可以使用 *
操作符来“解包” c
:
data = np.array(zip(a, b, *c))
data.shape
=> (4, 4)
(你也可以不使用 zip
,直接用 numpy 的方法,比如使用 vstack
,正如 @metaperture 提到的那样,这可能是更好的方法。不过,这个回答展示了如何正确地做你最初想做的事情。)
3
我会使用numpy的hstack或vstack:
a = np.ones(4) * 5
b = np.ones(4) * 4
c = np.ones((2, 4))
data = np.vstack([a,b,c]).T
补充:其实我现在主要使用np.row_stack和column_stack,因为我觉得它们比hstack或vstack更自然:
data = np.column_stack([a,b,c.T])