簡體   English   中英

在ndarray中反轉任意維度

[英]Reverse an arbitrary dimension in an ndarray

我正在使用n維數組,我想要一種方法來反轉編號維度。 所以而不是

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

我希望能夠寫作

rev = a.reverse(dimension=2)

或類似的東西。 我似乎無法找到不依賴於前一種語法的示例。

如果你瀏覽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]]]

事實證明,這可以通過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) ,完全按照要求執行。 更好的是,它返回數據的視圖而不是副本,因此它會在不變的時間內發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM