将掩码数组返回为简单数组,掩码值为None。

6

我需要按照另一个数组b中的条件过滤数组a

例如,只有当数组b中相同位置的值等于0时,才应该保留数组a中的值,否则将返回None。举个例子:

a = np.array([2, 2, 4, 0, 4, 3, 3, 3, 1, 2])

被遮蔽

b = np.array([0, 0, 0, 1, 0, 3, 0, 5, 0, 0])

返回

c: [2, 2, 4, None, 4, None, 3, None, 1, 2]

我已经尝试过。
to_change = np.ma.masked_where(travel_time!=0, new_subareas)

但是这个返回值为:
masked_array(data=[2, 2, 4, --, 4, --, 3, --, 1, 2],
             mask=[False, False, False,  True, False,  True, 
                   False,  True, False, False],
                   fill_value=999999)

但我找不到任何可以像给出c的示例那样返回结果的内容。

我需要在完全使用numpy且没有for循环或if语句的情况下完成,以便处理非常大的数组。 我错过了什么?


你需要一个新的数组还是直接修改 a 的原地解决方案就足够了? - jpp
2个回答

7
< p > masked_array 有更多的开销,因为对这些操作会隐式忽略蒙版值(而是操作其他所有内容)。

如果您不需要这种功能,可以使用 np.where,但风险是将数组转换为 object

np.where(b == 0, a, None)
array([2, 2, 4, None, 4, None, 3, None, 1, 2], dtype=object)

我建议用 NaN 进行替换,你觉得如何?
np.where(b == 0, a, np.nan)
array([ 2.,  2.,  4., nan,  4., nan,  3., nan,  1.,  2.])

保留数字类型。

非常完美和简单,特别是在使用np.nan时,我正在尝试保留数字类型,谢谢。 - MoMiJi

1
如果您需要一种就地解决方案,可以将a转换为float,然后使用np.where
这里需要进行浮点数转换,因为np.nan是一个float
a = np.array([2, 2, 4, 0, 4, 3, 3, 3, 1, 2])
b = np.array([0, 0, 0, 1, 0, 3, 0, 5, 0, 0])

a = a.astype(float)
a[np.where(b!=0)] = np.nan

# array([  2.,   2.,   4.,  nan,   4.,  nan,   3.,  nan,   1.,   2.])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接