2012-11-05 78 views
7

我正在處理一個n維數組,並且我想要一種方法來反轉編號的維度。因此,而不是在ndarray中反轉任意尺寸

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

我希望能夠寫

rev = a.reverse(dimension=2) 

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

+0

如果你知道你需要的語法,爲什麼不把它放到你自己的'rev'函數中? – Makoto

+0

我會很好,但我希望函數採取一個整數(維度反向)並返回沿該維度顛倒的數組。我不知道如何將'1:'轉換爲'[:,:: - 1,:]'和'0'爲[[:: - 1,:,]]尺寸。 – Shep

回答

1

對於任何人碰到這個即將到來的未來:

Numpy 1.12+的功能np.flip(array, dimension),它完全按照要求。更好的是,它返回的是數據視圖而不是副本,所以它會在一段時間內發生。

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]]] 
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]] 
+0

切片是最好的! – David