在ndarray中反转任意维度

时间:2012-11-05 20:47:57

标签: python multidimensional-array numpy

我正在使用n维数组,我想要一种方法来反转编号维度。所以而不是

rev = a[:,:,::-1]

我希望能够写

rev = a.reverse(dimension=2)

或类似的东西。我似乎无法找到不依赖于前一种语法的示例。

3 个答案:

答案 0 :(得分:9)

如果你浏览numpy(python)源代码,你会发现他们用来编写在特定轴上运行的函数的技巧是使用np.swapaxes将目标轴放在axis = 0中位置。然后他们编写在0-axis上运行的代码,然后再次使用np.swapaxes0-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),它完全按照要求执行。更好的是,它返回数据的视图而不是副本,因此它会在恒定的时间内发生。