使用 numpy 在多个维度上高效展开
Efficiently unwrap in multiple dimensions with 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 有更有效的方法吗?
我不确定是否有办法绕过沿每个轴执行 unwrap
操作。显然,如果它作用于单个元素,您可以使用矢量化,但这似乎不是这里的一个选项。你可以做的至少使 code 更干净的是在维度上创建一个循环:
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中需要从functools
导入3个reduce
。
您可以使用 np.apply_over_axes
,它应该依次对数组的每个维度应用一个函数:
np.apply_over_axes(np.unwrap, A, np.arange(len(A.shape)))
我认为应该这样做。
假设我有一个相位数组(来自复数)
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 有更有效的方法吗?
我不确定是否有办法绕过沿每个轴执行 unwrap
操作。显然,如果它作用于单个元素,您可以使用矢量化,但这似乎不是这里的一个选项。你可以做的至少使 code 更干净的是在维度上创建一个循环:
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中需要从functools
导入3个reduce
。
您可以使用 np.apply_over_axes
,它应该依次对数组的每个维度应用一个函数:
np.apply_over_axes(np.unwrap, A, np.arange(len(A.shape)))
我认为应该这样做。