2017-07-19 54 views
2

假設我有相位數組(從複數)在多個維度有效地拆開包裝與numpy的

A = np.angle(np.random.uniform(-1,1,[10,10,10]) + 1j*np.random.uniform(-1,1,[10,10,10])) 

我現在想解開這個陣列中的所有尺寸。在上述情況下,3D,我會做

A_unwrapped = np.unwrap(np.unwrap(np.unwrap(A,axis=0), axis=1),axis=2) 

雖然這仍然是在3D的情況下是可行的,在更高維度的情況下,這種做法在我看來,有些麻煩。有沒有更有效的方法來做到這一點與numpy?

+0

'np.apply_over_axes(np.unwrap,A,(0,1,2))''也許? –

+0

@cᴏʟᴅsᴘᴇᴇᴅ這也是一個很好的!人們可以使用'np.arange(ndim)'指定軸。你想發佈它作爲答案嗎? – Ethunxxx

+0

呃,當然。完成。 –

回答

1

你可以使用np.apply_over_axes,這應該又一個數組的每個維度應用功能:

np.apply_over_axes(np.unwrap, A, np.arange(len(A.shape))) 

我相信這應該這樣做。

+0

我期望所有這些解決方案都具有相同的速度,因爲它們都調用'unwrap''ndim'次。 – hpaulj

+0

@hpaulj是的...在這一點上,它只是你想要解包代碼需要多少行代碼。 –

0

我不確定是否有辦法繞過每個軸執行unwrap操作。顯然,如果它對單個元素採取行動,你可以使用矢量化,但在這裏似乎並不是一種選擇。你可以做什麼,這將至少使代碼清潔是創造超過尺寸的循環:

for dim in range(len(A.shape)): 
    A = np.unwrap(A, axis=dim) 

你還可以重複應用一個函數,它在其尺寸爲參數進行操作:

reduce(lambda A, axis: np.unwrap(A, axis=axis), range(len(A.shape)), A) 

請記住,在Python 3中需要從functools導入reduce