11

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

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

我希望能够写作

rev = a.reverse(dimension=2)

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

4

3 回答 3

10

如果您浏览 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]]]
于 2012-11-05T20:57:20.203 回答
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]]
于 2013-06-20T18:00:27.980 回答
6

对于将来遇到此问题的任何人:

Numpy 1.12+ 具有功能np.flip(array, dimension),它完全按照要求进行。更好的是,它返回的是数据视图而不是副本,因此它会在恒定时间内发生。

于 2017-02-28T19:27:39.603 回答