如何在numpy中优雅地通过子阵列重新排列数组?

时间:2017-01-27 23:19:49

标签: python arrays numpy sub-array

我们说我有一个三维数组:

[[[0,1,2],
  [0,1,2],
  [0,1,2]],

 [[3,4,5],
  [3,4,5],
  [3,4,5]]]

我想通过列重新排列:

[[0,1,2,3,4,5],
 [0,1,2,3,4,5],
 [0,1,2,3,4,5]]

对于基本上任意形状和深度的3-D np.array来说,这是一个优雅的python numpy代码是什么? 是否有绕过循环的快速方法?我所做的所有方法都非常特别和粗暴,它们基本上太慢而且无用......

谢谢!

2 个答案:

答案 0 :(得分:2)

交换轴并重塑 -

a.swapaxes(0,1).reshape(a.shape[1],-1)

示例运行 -

In [115]: a
Out[115]: 
array([[[0, 1, 2],
        [0, 1, 2],
        [0, 1, 2]],

       [[3, 4, 5],
        [3, 4, 5],
        [3, 4, 5]]])

In [116]: a.swapaxes(0,1).reshape(a.shape[1],-1)
Out[116]: 
array([[0, 1, 2, 3, 4, 5],
       [0, 1, 2, 3, 4, 5],
       [0, 1, 2, 3, 4, 5]])

答案 1 :(得分:1)

使用einops:

einops.rearrange(a, 'x y z -> y (x z) ')

并且我建议根据上下文(例如时间,高度等)为轴指定有意义的名称(而不是x y z)。这将使您易于理解代码的作用

In : einops.rearrange(a, 'x y z -> y (x z) ')
Out:
array([[0, 1, 2, 3, 4, 5],
       [0, 1, 2, 3, 4, 5],
       [0, 1, 2, 3, 4, 5]])