Python zip不同维度的numpy数组

时间:2014-05-30 17:33:44

标签: python arrays 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 个答案:

答案 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来打开"解压缩"致电czip

data = np.array(zip(a, b, *c))
data.shape
=> (4, 4)

(你可以避免zip并使用直接的numpy方法(例如使用vstack,如@metaperture建议的那样),这可以说是一种更好的方法。但是,这个答案说明了正确的方法。正是你原本想要做的事情)

答案 2 :(得分:1)

如果您的唯一目标是保存多个不同维度的数组,我会建议使用zip,正如此问题的标题所暗示的那样。请改用np.saveznp.savez_compressed。这些函数旨在保存多个数组(任意维度)。

使用zip特别糟糕,因为它不会移植到Python3,其中zip会返回迭代器而不是元组列表。在迭代器上调用np.array会创建一个包含单个元素dtype object的数组,这可能不是您想要的。 保存和加载后,我无法恢复压缩数据。