将二维numpy数组列表转换为一个三维numpy数组?

29 投票
1 回答
26424 浏览
提问于 2025-04-16 07:57

我有几百个10x10的数组,想把它们合并成一个大的Nx10x10的数组。开始的时候我试了一个简单的方法:

newarray = np.array(mylist)

但是出现了一个错误:“ValueError: setting an array element with a sequence.”

然后我找到了dstack()的在线文档,看起来很合适:“...这是将二维数组(图像)堆叠成一个三维数组以便处理的简单方法。”这正是我想做的。然而,

newarray = np.dstack(mylist)

却告诉我“ValueError: array dimensions must agree except for d_0”,这让我很困惑,因为我的所有数组都是10x10的。我想也许是因为dstack()需要一个元组而不是列表,但

newarray = np.dstack(tuple(mylist))

结果还是一样。

到现在为止,我已经花了大约两个小时在这里和其他地方寻找我哪里出错了,或者该怎么正确地做。我甚至尝试把我的数组列表转换成列表的列表的列表,然后再转换回三维数组,但那也没成功(最后得到的是列表的列表的数组,接着又出现了“setting array element as sequence”的错误)。

任何帮助都将不胜感激。

1 个回答

47
newarray = np.dstack(mylist)

这个应该没问题。比如:

import numpy as np

# Here is a list of five 10x10 arrays:
x = [np.random.random((10,10)) for _ in range(5)]

y = np.dstack(x)
print(y.shape)
# (10, 10, 5)

# To get the shape to be Nx10x10, you could  use rollaxis:
y = np.rollaxis(y,-1)
print(y.shape)
# (5, 10, 10)

np.dstack 会返回一个新的数组。所以,使用 np.dstack 的时候,需要的内存和输入的数组一样多。如果你的内存不够用,可以考虑一个更省内存的方法,就是先为最终的数组预留好空间,然后再一个一个地把输入的数组放进去。比如,如果你有58个形状为(159459, 2380)的数组,你可以使用

y = np.empty((159459, 2380, 58))
for i in range(58):
    # instantiate the input arrays one at a time
    x = np.random.random((159459, 2380))
    # copy x into y
    y[..., i] = x

撰写回答