如何在 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]])
假设我有一个 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]])