从2D数组创建4D数组

3

我有若干个形状为Numpy数组

print(x.shape)
>>>(256,256)

如何堆叠它们以使形状为:
print(y.shape)
>>>(certainnumber,256,256,1)

我一直在尝试使用np.stack和np.concatenate,但是我只得到了轴错误或类似的东西

print(y.shape)
>>>(anothernumber,256) 

在编码之前,你需要想象一下数组的样子……这样就不会出现这样的错误了。 - bigbounty
3个回答

3

方法 #1

这里有一个使用np.stack的方法 -

np.stack(list_of_arrays)[...,None]

方法 #2

您可以为这些数组中的每一个使用None/np.newaxis添加新轴,并沿着第一个轴进行连接,以得到(特定数字,256,256)形状,像这样 -

np.concatenate([i[None] for i in list_of_arrays],axis=0)

接着,将新的轴作为最终形状为(certainnumber,256,256,1)的尾随轴添加进去,就像这样 -

np.concatenate([i[None] for i in list_of_arrays],axis=0)[...,None]

示例运行

In [32]: a = np.random.rand(3,4)

In [33]: b = np.random.rand(3,4)

In [34]: list_of_arrays = [a,b]

In [42]: np.stack(list_of_arrays)[...,None].shape
Out[42]: (2, 3, 4, 1)

In [35]: np.concatenate([i[None] for i in list_of_arrays],axis=0)[...,None].shape
Out[35]: (2, 3, 4, 1)

我喜欢你的回答,它很好地展示了你思考这类问题的方式。 - juanpa.arrivillaga
@juanpa.arrivillaga 我不确定是否看得出来,但我的思维方式更适合形状而非实际值。这个问题正好符合那个标准 :) - Divakar

2
假设您的数组已经存储在某种容器中(您始终可以将它们放入容器中):
>>> ax = [np.random.randint(0, 10, (3,3)) for _ in range(4)]
>>> ax
[array([[0, 3, 1],
       [4, 2, 4],
       [2, 2, 8]]), array([[8, 4, 6],
       [7, 1, 4],
       [8, 9, 8]]), array([[6, 3, 8],
       [4, 6, 8],
       [2, 2, 9]]), array([[1, 8, 1],
       [0, 9, 2],
       [9, 2, 3]])]

所以,您可以使用np.concatenate但也必须进行重塑:

>>> final = np.concatenate([arr.reshape(1, 3,3,1) for arr in ax], axis=0)

带有结果:

>>> final.shape
(4, 3, 3, 1)
>>> final
array([[[[0],
         [3],
         [1]],

        [[4],
         [2],
         [4]],

        [[2],
         [2],
         [8]]],


       [[[8],
         [4],
         [6]],

        [[7],
         [1],
         [4]],

        [[8],
         [9],
         [8]]],


       [[[6],
         [3],
         [8]],

        [[4],
         [6],
         [8]],

        [[2],
         [2],
         [9]]],


       [[[1],
         [8],
         [1]],

        [[0],
         [9],
         [2]],

        [[9],
         [2],
         [3]]]])
>>>

编辑

受@Divakar启发,为了更加通用化:

np.concatenate([arr[None,..., None] for arr in ax], axis=0)

一个通用的(使用形状参数)实现会很好看。 - Divakar
最新的添加不错! - Divakar
顺便问一下,我之后怎么添加另一个256x256的数组? - Boris
它将是out = np.append(out,ar[None,...], axis=0),其中ar是另一个数组。 - Boris

1
你可以在 np.stack 中添加一个 axis 参数来指定你想要沿着哪个轴进行堆叠:
arrs = [np.random.rand(256, 256) for i in range(11)]
out = np.stack(arrs, axis=0)
out.shape
# (11, 256, 256)

(注意轴默认为零)。
如果您需要在形状末尾添加一个1,则使用newaxis
out[..., np.newaxis].shape
(11, 256, 256, 1)

1
默认情况下,它沿 axis=0 工作 :) 因此,我们可以跳过该轴参数,但我想这对于解释很有好处。 - Divakar
最易理解 - Boris

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