我需要通过另一个数组a
实现的条件来掩盖数组b
。
例如a
中的值只有在b
的相同位置的值等于0时才能保留,否则返回为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语句的速度,因为这将适用于非常大的数组。
我错过了什么?
答案 0 :(得分:2)
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.])
保留数字类型。
答案 1 :(得分: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.])