Python 打包不同维度的 numpy 数组

2 投票
3 回答
4779 浏览
提问于 2025-04-18 08:04

我想在通过 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])

撰写回答