将屏蔽数组作为简单数组返回,屏蔽值为None

时间:2018-03-23 16:06:46

标签: python arrays numpy masked-array

我需要通过另一个数组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语句的速度,因为这将适用于非常大的数组。 我错过了什么?

2 个答案:

答案 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)

如果您需要就地解决方案,可以转换为afloat,然后使用np.where

此处需要进行浮动转换,因为np.nanfloat

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.])