numpy的ma.isin处理掩码数组出现意外掩码元素,是否为Bug?
问题原因分析
这个现象是你使用的numpy 1.20.3版本中ma.isin函数的已知实现缺陷导致的,该缺陷在numpy 1.22及后续版本中已经被修复。
具体的错误逻辑如下:
- 旧版
ma.isin没有正确继承输入掩码数组的掩码状态:你输入的a数组第一个位置是掩码状态,但返回结果的第一个位置掩码反而为False,本身就不符合掩码数组的运算规则。 - 旧版
ma.isin在计算完成后,会额外添加一层错误的掩码规则:会将输入数组中元素不在测试数组中、同时输入数组的填充值(fill_value)不在测试数组中的位置错误标记为掩码状态。你这里a的填充值是999999,确实不在ta的[1,4,5]范围内,而a的最后一个元素6也不在ta中,所以被错误加了掩码。
替代方案
如果需要在保留掩码逻辑的前提下得到正确结果,在未升级numpy版本的情况下可以用如下方式实现:
# 先继承原数组的掩码,再用np.isin计算有效值的匹配状态 result = ma.array(np.isin(a, ta), mask=a.mask)
运行该代码得到的结果就是符合预期的:
masked_array( data=[[--, False, False], [ True, True, False]], mask=[[ True, False, False], [False, False, False]], fill_value=True)
内容的提问来源于stack exchange,提问作者sebschub
相关产品推荐
相关产品推荐

