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

How to rearrange an array by subarray elegantly in numpy?

假设我有一个 3 维数组:

[[[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 代码是什么? 有没有绕过 for 循环的快速方法?我采用的所有方法都非常临时和粗暴,它们基本上太慢且无用...

谢谢!!

交换轴并重塑 -

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]])

使用 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]])