我正在使用一个 n 维数组,我想要一种反转编号维度的方法。所以而不是
rev = a[:,:,::-1]
我希望能够写作
rev = a.reverse(dimension=2)
或类似的东西。我似乎找不到不依赖前一种语法的示例。
我正在使用一个 n 维数组,我想要一种反转编号维度的方法。所以而不是
rev = a[:,:,::-1]
我希望能够写作
rev = a.reverse(dimension=2)
或类似的东西。我似乎找不到不依赖前一种语法的示例。
如果您浏览 numpy (python) 源代码,您会发现他们用来编写在特定轴上操作的函数的技巧是用来np.swapaxes
将目标轴放在该axis = 0
位置。然后他们编写对 进行操作的代码,0-axis
然后他们np.swapaxes
再次使用将0-axis
背面置于其原始位置。
你可以在这里这样做:
import numpy as np
def rev(a, axis = -1):
a = np.asarray(a).swapaxes(axis, 0)
a = a[::-1,...]
a = a.swapaxes(0, axis)
return a
a = np.arange(24).reshape(2,3,4)
print(rev(a, axis = 2))
产量
[[[ 3 2 1 0]
[ 7 6 5 4]
[11 10 9 8]]
[[15 14 13 12]
[19 18 17 16]
[23 22 21 20]]]
事实证明,这可以用 来完成slice
,在某些情况下它:
是简写。诀窍是将索引对象构建为切片元组:
import numpy as np
def reverse(a, axis=0):
idx = [slice(None)]*len(a.shape)
idx[axis] = slice(None, None, -1)
return a[idx]
a = np.arange(24).reshape(2,3,4)
print reverse(a, axis=2)
有了Ellipsis
这个可以折叠成一个单行:
a[[slice(None)]*axis + [slice(None, None, -1)] + [Ellipsis]]
对于将来遇到此问题的任何人:
Numpy 1.12+ 具有功能np.flip(array, dimension)
,它完全按照要求进行。更好的是,它返回的是数据视图而不是副本,因此它会在恒定时间内发生。