将Numpy方阵阵列转换为numpy square array,保留“布局”

时间:2018-03-07 21:08:14

标签: python arrays numpy

我第一次在这里问一些事情。我有点'被封锁'。

我有一个由n x n个数组组成的数组(为了简化,我们采用n = 3):

[
    [
        [ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]
    ],
   [
        [9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]
    ],
   [
        [18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]
    ]
        ]

(虽然我的数组包含超过3个3 * 3阵列)

我想要实现这样的2D数组:

[0,1,2,9,10,11,18,19,20]  
[3,4,5,12,13,14,21,22,23]    
[6,7,8,15,16,17,24,25,26]

是否有一个我没有想到的技巧,因为我无法想到任何方法来实现转型。

由于

4 个答案:

答案 0 :(得分:2)

moveaxis稍微清洁一点:

import numpy as np
a = np.arange(27).reshape(3,3,3)
a.swapaxes(0,1).reshape(3,-1)
array([[ 0,  1,  2,  9, 10, 11, 18, 19, 20],
   [ 3,  4,  5, 12, 13, 14, 21, 22, 23],
   [ 6,  7,  8, 15, 16, 17, 24, 25, 26]])

答案 1 :(得分:1)

将此视为3个数组的列表,您想要水平连接:

In [171]: arr = np.arange(27).reshape(3,3,3)
In [172]: np.hstack(arr)
Out[172]: 
array([[ 0,  1,  2,  9, 10, 11, 18, 19, 20],
       [ 3,  4,  5, 12, 13, 14, 21, 22, 23],
       [ 6,  7,  8, 15, 16, 17, 24, 25, 26]])

In [173]: arr
Out[173]: 
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])

我喜欢用不同尺寸的数组测试想法。然后各种轴操作变得更加明显。

In [174]: arr = np.arange(24).reshape(2,3,4)
In [175]: arr
Out[175]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
In [176]: np.hstack(arr)
Out[176]: 
array([[ 0,  1,  2,  3, 12, 13, 14, 15],
       [ 4,  5,  6,  7, 16, 17, 18, 19],
       [ 8,  9, 10, 11, 20, 21, 22, 23]])

In [177]: np.vstack(arr)
Out[177]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22, 23]])

但是如果从3d数组(而不是数组列表)开始,转置和重塑答案的变化没有任何问题:

In [187]: arr.transpose(1,0,2).reshape(3,-1)
Out[187]: 
array([[ 0,  1,  2,  9, 10, 11, 18, 19, 20],
       [ 3,  4,  5, 12, 13, 14, 21, 22, 23],
       [ 6,  7,  8, 15, 16, 17, 24, 25, 26]])

答案 2 :(得分:1)

您可以使用np.block

>>> import numpy as np
>>> X = np.arange(27).reshape(3, 3, 3)
>>> 
>>> np.block(list(X))
array([[ 0,  1,  2,  9, 10, 11, 18, 19, 20],
       [ 3,  4,  5, 12, 13, 14, 21, 22, 23],
       [ 6,  7,  8, 15, 16, 17, 24, 25, 26]])

答案 3 :(得分:0)

简单的重塑是不够的,因为你必须先改变轴的顺序:

import numpy as np
a = np.array([[[0,1,2],[3,4,5],[6,7,8]],[[9,10,11],[12,13,14],[15,16,17]],[[18,19,20],[21,22,23],[24,25,26]]])
np.moveaxis(a, 0, 1).reshape(3,9)

[[ 0  1  2  9 10 11 18 19 20]
 [ 3  4  5 12 13 14 21 22 23]
 [ 6  7  8 15 16 17 24 25 26]]