重新排序3D numpy阵列

时间:2018-11-01 14:14:12

标签: python numpy

我有一个3D阵列

>>> a
array([[[[9, 6, 1],
         [2, 8, 6],
         [3, 5, 6]],

        [[9, 1, 9],
         [6, 6, 7],
         [3, 0, 7]],

        [[9, 2, 7],
         [6, 1, 4],
         [9, 2, 2]],

        [[3, 7, 0],
         [4, 0, 6],
         [7, 4, 8]]]]) 

现在我要重塑该数组,将特定值组合在一起,即

 >>> a[0,:,0,0]
 array([9, 9, 9, 3])

所以基本上,我希望每个框的第一个元素在一个数组中,每个框的第二个元素在另一个数组中,依此类推。

到目前为止,我将其重塑为以下内容:

>>> b = a[0,:,:,:].T
>>> b
array([[[9, 9, 9, 3],
        [2, 6, 6, 4],
        [3, 3, 9, 7]],

       [[6, 1, 2, 7],
        [8, 6, 1, 0],
        [5, 0, 2, 4]],

       [[1, 9, 7, 0],
        [6, 7, 4, 6],
        [6, 7, 2, 8]]])

这样,数组已经被构造好了,但是排序是错误的。这样,将2x4矩阵逐行构造。我希望它是按列构造的,也就是说,在这种情况下,以下应该是前六行:

>>> b[:,0,:]
array([[9, 9, 9, 3],
       [6, 1, 2, 7],
       [1, 9, 7, 0]])

>>> b[:,1,:]
array([[2, 6, 6, 4],
       [8, 6, 1, 0],
       [6, 7, 4, 6]])

我一直在摆弄如何索引正确构建数组的索引。考虑问题的一种直观方法是考虑将3x3矩阵彼此堆叠在一起,我想在z方向上切出1x4数组(这样就成堆),并将它们按行放入一个数组中。

我的意思是我可以使用for循环遍历它们,但是我宁愿通过索引和切片对整个对象进行矢量化处理。任何帮助表示赞赏!谢谢

np.concatenate([b[:,i,:] for i in range(3)])

1 个答案:

答案 0 :(得分:3)

numpy.transpose(..)是可以按任意顺序排列轴的功能。

如果我理解正确的话,您基本上希望第三和第四轴是新矩阵的第一和第二轴,而旧的第一和第二矩阵是新的第三和第四轴。

因此,我们可以使用以下方式进行转置:

>>> a.transpose((2,3,0,1))
array([[[[9, 9, 9, 3]],
        [[6, 1, 2, 7]],
        [[1, 9, 7, 0]]],

       [[[2, 6, 6, 4]],
        [[8, 6, 1, 0]],
        [[6, 7, 4, 6]]],

       [[[3, 3, 9, 7]],
        [[5, 0, 2, 4]],
        [[6, 7, 2, 8]]]])

由于在这里构造了一个4d数组,但是第一个索引只有一个元素,所以最好删除该索引,例如:

>>> a[0,:,:,:].transpose(1,2,0)
array([[[9, 9, 9, 3],
        [6, 1, 2, 7],
        [1, 9, 7, 0]],

       [[2, 6, 6, 4],
        [8, 6, 1, 0],
        [6, 7, 4, 6]],

       [[3, 3, 9, 7],
        [5, 0, 2, 4],
        [6, 7, 2, 8]]])