2

假设我有一个阶段数组(来自复数)

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 做到这一点?

4

2 回答 2

1

您可以使用np.apply_over_axes,它应该依次在数组的每个维度上应用一个函数:

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

我相信这应该这样做。

于 2017-07-19T09:33:21.903 回答
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 中reduce需要从functools.

于 2017-07-19T09:20:19.277 回答