为什么numpy angle函数对掩码数组值也返回结果

5 投票
1 回答
1100 浏览
提问于 2025-04-17 07:29

如果你尝试下面这段代码

import numpy as np
import numpy.ma as ma

a = np.random.random(100) + 1j*np.random.random(100)
mask = np.ones_like(a, dtype='bool')
mask[0:9] = False
a = ma.masked_array(a, mask)
phase = np.angle(a)

那么这个相位数组不会被遮罩。角度函数会对整个数组返回值,即使是那些被遮罩掉的值。请问我是不是做错了什么,还是说这样就是正常的?如果是这样的话,为什么会这样呢?

1 个回答

3

我简单看了一下numpy的源代码,可能这是个bug,或者说还没有实现。

在numpy.ma页面上,它被标记为“缺失功能(正在开发中)”,这是第一个问题:http://projects.scipy.org/numpy/wiki/MaskedArray

问题在于一些单一函数,比如 np.anglenp.quantile 在源代码中调用了 [np.]asarray,这会把掩码去掉。

正如开发者在我链接的页面上解释的那样,如果这些函数使用 ma.asarray 而不是 np.asarray,它们就能正常工作,但实际上并没有这样做 :(。

我猜这可能是一个还没提交的修复吧?

作为一个临时解决办法,np.angle 实际上是调用了 np.arctan2(a.imag,a.real)(可以选择乘以180/pi来转换成度数),所以你可以用这个方法。

撰写回答