我想通过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)
但这看起来有些欠佳。谢谢你的建议。
答案 0 :(得分:2)
我会使用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])
答案 1 :(得分:2)
使用*
opertor来打开"解压缩"致电c
时zip
:
data = np.array(zip(a, b, *c))
data.shape
=> (4, 4)
(你可以避免zip
并使用直接的numpy方法(例如使用vstack
,如@metaperture建议的那样),这可以说是一种更好的方法。但是,这个答案说明了正确的方法。正是你原本想要做的事情)
答案 2 :(得分:1)
如果您的唯一目标是保存多个不同维度的数组,我会不建议使用zip
,正如此问题的标题所暗示的那样。请改用np.savez
或np.savez_compressed
。这些函数旨在保存多个数组(任意维度)。
使用zip
特别糟糕,因为它不会移植到Python3,其中zip
会返回迭代器而不是元组列表。在迭代器上调用np.array
会创建一个包含单个元素dtype object
的数组,这可能不是您想要的。
保存和加载后,我无法恢复压缩数据。