首页 > 解决方案 > 操作 numpy 数组(连接内部子数组)

问题描述

我有一个操作 numpy 数组的问题。比如说,给定一个数组形式的 3-dnp.array([[[1,2],[3,4]], [[5,6],[7,8]]])数组(2,2,2)。我想将它操纵成一个(2,4)数组,这样a = np.array([[1,2,5,6],[3,4,7,8]]). 我想知道是否有任何内置的 numpy 方法,特别是处理这样的问题并且可以很容易地概括。

编辑: 谢谢大家的回答。他们都摇滚!我想我应该澄清我在原始帖子中“容易概括”的意思。假设给定一个(6,3,2,3)数组(这是我面临的实际挑战)

a = array([[[[ 10,  20,  30],
         [ 40,  40,  20]],

        [[ 22,  44,  66],
         [ 88,  88,  44]],

        [[ 33,  66,  99],
         [132, 132,  66]]],


       [[[ 22,  44,  66],
         [ 88,  88,  44]],

        [[ 54, 108, 162],
         [216, 216, 108]],

        [[ 23,  46,  69],
         [ 92,  92,  46]]],


       [[[ 14,  28,  42],
         [ 56,  56,  28]],

        [[ 25,  50,  75],
         [100, 100,  50]],

        [[ 33,  66,  99],
         [132, 132,  66]]],


       [[[ 20,  40,  60],
         [ 80,  80,  40]],

        [[ 44,  88, 132],
         [176, 176,  88]],

        [[ 66, 132, 198],
         [264, 264, 132]]],


       [[[ 44,  88, 132],
         [176, 176,  88]],

        [[108, 216, 324],
         [432, 432, 216]],

        [[ 46,  92, 138],
         [184, 184,  92]]],


       [[[ 28,  56,  84],
         [112, 112,  56]],

        [[ 50, 100, 150],
         [200, 200, 100]],

        [[ 66, 132, 198],
         [264, 264, 132]]]])

我想把它按摩成一个(3,3,2,2,3)数组,这样a[0,:,:,:,:]

a[0,0,0,:,:] = np.array([[10,20,30],[40,40,20]]);
a[0,1,0,:,:] = np.array([[22,44,66],[88,88,44]]);
a[0,2,0,:,:] = np.array([[33,66,99],[132,132,66]]);
a[0,0,1,:,:] = np.array([[20,40,60],[80,80,40]]);
a[0,1,1,:,:] = np.array([[44,88,132],[176,176,88]]);
a[0,2,1,:,:] = np.array([[66,132,198],[264,264,132]]).

简而言之,最后 3 个最大的块应该与前 3 个最大的块“合并”以形成 3(3,2)个块。其余 2 个块,即 ( a[1,:,:,:,:], a[2,:,:,:,:]) 遵循相同的模式。

标签: pythonarraysnumpy

解决方案


您的主题行回答了您的问题:

In [813]: a
Out[813]: 
array([[[1, 2],
        [3, 4]],

       [[5, 6],
        [7, 8]]])
In [818]: np.concatenate(a, axis=1)    # aka np.hstack
Out[818]: 
array([[1, 2, 5, 6],
       [3, 4, 7, 8]])

这将数组视为 2 (2,2) 个子数组。

另一个连接选项:

In [819]: np.concatenate(a, axis=0)
Out[819]: 
array([[1, 2],
       [3, 4],
       [5, 6],
       [7, 8]])

我认为转置后跟 reshape 更好,更容易概括。但它需要一些关于如何存储数组的知识,以及维度的含义和转置它们的方式。

plainreshape不起作用的原因是您想重新排序数组的元素。

如文档reshape所述,有效地分解数组,然后应用新形状:

In [823]: a.ravel()
Out[823]: array([1, 2, 3, 4, 5, 6, 7, 8])

但是你的新数组有不同的顺序:

In [824]: np.concatenate(a, axis=1).ravel()
Out[824]: array([1, 2, 5, 6, 3, 4, 7, 8])

推荐阅读