【问题标题】:Reverse an arbitrary dimension in an ndarray反转ndarray中的任意维度
【发布时间】:2012-11-05 20:47:56
【问题描述】:

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

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

我希望能够写作

rev = a.reverse(dimension=2)

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

【问题讨论】:

  • 如果你知道你需要的语法,为什么不把它放到你自己的rev函数中呢?
  • 我很好,但我希望函数采用整数(要反转的维度)并返回沿该维度反转的数组。对于任意数量的维度,我不知道如何将(例如)1 转换为 [:,::-1,:]0 转换为 [::-1,:,:]
  • Numpy 的__getitem__ 采用tupleslices 所以你可以做a[tuple(slice(None, None, -1) if idx == dimension else slice(None) for idx in range(a.ndim))]

标签: python multidimensional-array numpy


【解决方案1】:

如果您浏览 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]]]

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      原来这可以用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]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-30
        • 2017-12-24
        • 2021-10-20
        • 1970-01-01
        • 2010-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多