我正在使用n维数组,我想要一种方法来反转编号维度。所以而不是
rev = a[:,:,::-1]
我希望能够写
rev = a.reverse(dimension=2)
或类似的东西。我似乎无法找到不依赖于前一种语法的示例。
答案 0 :(得分:9)
如果你浏览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]]]
答案 1 :(得分:6)
原来可以使用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]]
答案 2 :(得分:3)
对于未来遇到此事的人:
Numpy 1.12+具有函数np.flip(array, dimension)
,它完全按照要求执行。更好的是,它返回数据的视图而不是副本,因此它会在恒定的时间内发生。