Numpy dstack用于3D数组

3
我有N个3D数组,它们的大小固定为(n1,n2,n3)。现在我想将它们合并成4D数组,并作为结果得到维度为:
(N,n1,n2,n3)
我该如何做?dstack可以对2D数组执行相同的操作,使它们变成3D。但是尝试将其应用于3D数组会导致错误的结果(n1,n2,n3 * N)。
编辑1:我需要在循环中完成此操作,因此循环中的每次迭代都会生成新的(n1,n2,n3)数组(3D数组),我应该将其放入4D数组中,并增加其第一个维度:第一次迭代将给出(1,n1,n2,n3)
然后第二次迭代将给出(2,n1,n2,n3)等等。

看一下这些不同的“stack”函数的代码。它们所做的只是调整输入数组的维度,然后使用“np.concatenate”。如果你把维度搞对了,你也可以直接使用“np.concatenate”(最好使用所有数组的列表)。 - hpaulj
1个回答

10

dstack仅为向后兼容而存在。请改用numpy.stack,它更通用且具有未来性:

import numpy as np

a = np.ones((4, 5, 6))
b = np.zeros((4, 5, 6))

c = np.stack([a, b])
print(c.shape)  # (2, 4, 5, 6)

d = np.stack([a, b], axis=2)  # You can stack along any axis
print(d.shape)  # (4, 5, 2, 6)

循环示例:

result = []
for i in range(n):
    x = np.random.randn(n1, n2, n3)
    result.append(x)
result = np.stack(result)

替代方案(速度较慢):

result = np.empty((0, n1, n2, n3))
for i in range(n):
    x = np.random.randn(n1, n2, n3)
    result = np.concatenate([result, x[np.newaxis]])

如果您事先知道N的大小,也可以进行预分配:

result = np.empty((n, n1, n2, n3))
for i in range(n):
    x = np.random.randn(n1, n2, n3)
    result[i] = x

抱歉,我刚刚编辑了我的问题并添加了额外的信息。你的方法虽然对于一个迭代很好,但下一个迭代会尝试将4D与3D堆叠。 - maximus
通常在循环中,我会将3D数组附加到列表中,并在循环结束后对该列表调用“stack”。(请参见更新的示例。)这比增长数组具有更好的性能,因为它避免了重新分配。 - MB-F

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接