2017-07-19 29 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