Numpy:从 4 个 (x,y) 数组创建一个 (x,y,2,2) 数组

Numpy: Creating an (x,y,2,2) array from 4 (x,y) arrays

我在广播方面遇到问题。如果可能的话,我希望能够在没有 for 循环的情况下将形状为 x、y 的 4 个不同数组的元素分配给 2x2 矩阵。

a = np.arange(6).reshape(2,3)
b = np.arange(6,12).reshape(2,3)
c = np.arange(12,18).reshape(2,3)
d = np.arange(18,24).reshape(2,3)
x = np.array([[a, b], [c, d]])

显然这是行不通的,但我希望 x 得出一个数组:

[   [
    [[0,6], [12, 18]], 
    [[1, 7], [13, 19]],
    [[2, 8], [14, 20]], 
    ],

    [
    [[3, 9], [15, 21]],
    [[4, 10], [16, 22]],
    [[5, 11], [17, 23]]
    ]
]

最简单的方法:在x =np.array([[a, b], [c, d]])之后定义 y=np.rollaxis(np.rollaxis(x,-1),-1)。这是 x 上的一个视图,因此没有完成任何复制。

另一种方法:自己创建新维度:

ac =np.concatenate((a[:,:,np.newaxis],c[:,:,np.newaxis]),axis=-1)
bd =np.concatenate((b[:,:,np.newaxis],d[:,:,np.newaxis]),axis=-1)
abcd =np.concatenate((ac[:,:,:,np.newaxis],bd[:,:,:,np.newaxis]),axis=-1)

然后

In [3]: abcd
Out[3]: array([[[[ 0,  6],
     [12, 18]],

    [[ 1,  7],
     [13, 19]],

    [[ 2,  8],
     [14, 20]]],


   [[[ 3,  9],
     [15, 21]],

    [[ 4, 10],
     [16, 22]],

    [[ 5, 11],
     [17, 23]]]])

这似乎是一种边缘情况,您最好的选择是构建数组然后手动填充它:

a = np.arange(6).reshape(2,3)
b = np.arange(6,12).reshape(2,3)
c = np.arange(12,18).reshape(2,3)
d = np.arange(18,24).reshape(2,3)

out = np.zeros(a.shape + (2,2))
out[..., 0, 0] = a
out[..., 0, 1] = b
out[..., 1, 0] = c
out[..., 1, 1] = d

>>> out
array([[[[  0.,   6.],
         [ 12.,  18.]],

        [[  1.,   7.],
         [ 13.,  19.]],

        [[  2.,   8.],
         [ 14.,  20.]]],


       [[[  3.,   9.],
         [ 15.,  21.]],

        [[  4.,  10.],
         [ 16.,  22.]],

        [[  5.,  11.],
         [ 17.,  23.]]]])

这是 np.dstackreshaping -

的一种方式
np.dstack((a,b,c,d)).reshape(a.shape + (2,2,))

样本运行-

输入:

In [32]: a
Out[32]: 
array([[0, 1, 2],
       [3, 4, 5]])

In [33]: b
Out[33]: 
array([[ 6,  7,  8],
       [ 9, 10, 11]])

In [34]: c
Out[34]: 
array([[12, 13, 14],
       [15, 16, 17]])

In [35]: d
Out[35]: 
array([[18, 19, 20],
       [21, 22, 23]])

输出:

In [36]: np.dstack((a,b,c,d)).reshape(a.shape + (2,2,))
Out[36]: 
array([[[[ 0,  6],
         [12, 18]],

        [[ 1,  7],
         [13, 19]],

        [[ 2,  8],
         [14, 20]]],


       [[[ 3,  9],
         [15, 21]],

        [[ 4, 10],
         [16, 22]],

        [[ 5, 11],
         [17, 23]]]])