2016-12-24 220 views
0

我有一些3D numpy數組需要以各種方式轉換。例如:三維numpy陣列的高效轉換

x.shape = (4, 17, 17) 

該陣列是4個平面的1個樣本,每個平面大小爲17x17。什麼是最有效的方式來改造每架飛機:flipud,fliplr和rot90?有沒有比使用for循環更好的方法?謝謝!

for p in range(4): 
    x[p, :, :] = np.fliplr(x[p, :, :]) 
+0

你能否使用一個示例數組並指出你想要它看起來像什麼......例如。 a = np.arange(3 * 4 * 5).reshape(3,4,5)... – NaN

回答

1

看看這些功能的代碼:

def fliplr(...): 
    .... 
    return m[:, ::-1] 

換句話說,它返回與反向切片視圖上的第二維

x[p, :, :] = np.fliplr(x[p, :, :]應用於的反向切片到最後一維,所以整個陣列的等價物應該是

x[:, :, ::-1] 

個翻轉第二軸將是

x[:, ::-1, :] 

np.rot90有4個的情況下(K);爲k=1

return fliplr(m).swapaxes(0, 1) 
換句話說 m[:, ::-1].swapaxes(0,1)

要在飛機工作,你會做這樣的事情

m[:, :,::-1].swapaxes(1,2) 

,或者你可以做swapaxes/transpose第一

m.transpose(0,2,1)[:, :, ::-1] 

這是否給你足夠的工具來改造飛機以你想要的方式?

正如我在另一個最近的問題https://stackoverflow.com/a/41291462/901925中討論的那樣,flip...返回一個視圖,但帶有翻轉和交換的rot90很可能會返回一個副本。無論哪種方式,numpy將給你最有效的版本。