我们说我有一个三维数组:
[[[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代码是什么? 是否有绕过循环的快速方法?我所做的所有方法都非常特别和粗暴,它们基本上太慢而且无用......
谢谢!
答案 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]])