Return 掩码数组作为简单数组,掩码值为 None

Return masked array as simple array with masked values as None

我需要通过另一个数组 b 满足的条件来屏蔽数组 a

例如 a 中的值只有在 b 相同位置的值等于 0 时才应保留,否则 return 与 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])

到return

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

我试过了

to_change = np.ma.masked_where(travel_time!=0, new_subareas)

但是这个 returns:

masked_array(data=[2, 2, 4, --, 4, --, 3, --, 1, 2],
             mask=[False, False, False,  True, False,  True, 
                   False,  True, False, False],
                   fill_value=999999)

但我找不到任何东西 return 类似于 c 的示例。

我需要完全在 numpy 中完成一些事情,并且没有 for 循环或 if 语句,因为这将用于非常大的数组,以提高速度。 我错过了什么?

masked_arrays 有更多的开销,因为对这些的操作隐式忽略掩码值(而是处理其他所有内容)。

如果您不需要那种功能,您可以只使用 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.])

保留数字类型。

如果你需要一个in-place的解决方案,你可以将a转换为float,然后使用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.])