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

MoM*_*iJi 4 python arrays numpy masked-array

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

例如,a仅当相同位置的值b等于 0时才应保留值,否则返回为None。例如:

a = np.array([2, 2, 4, 0, 4, 3, 3, 3, 1, 2])
Run Code Online (Sandbox Code Playgroud)

被掩盖了

b = np.array([0, 0, 0, 1, 0, 3, 0, 5, 0, 0])
Run Code Online (Sandbox Code Playgroud)

返回

c: [2, 2, 4, None, 4, None, 3, None, 1, 2]
Run Code Online (Sandbox Code Playgroud)

我试过了

to_change = np.ma.masked_where(travel_time!=0, new_subareas)
Run Code Online (Sandbox Code Playgroud)

但这会返回:

masked_array(data=[2, 2, 4, --, 4, --, 3, --, 1, 2],
             mask=[False, False, False,  True, False,  True, 
                   False,  True, False, False],
                   fill_value=999999)
Run Code Online (Sandbox Code Playgroud)

但是我找不到任何只会返回类似于为c.

我需要完全在numpy和不使用 for 循环或 if 语句中完成某些操作,以提高速度,因为这将适用于非常大的数组。我错过了什么?

cs9*_*s95 7

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

如果您不是在寻找那种功能,您可以只使用np.where,但您可能会冒险将数组转换为object.

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

我建议用NaN代替?

np.where(b == 0, a, np.nan)
array([ 2.,  2.,  4., nan,  4., nan,  3., nan,  1.,  2.])
Run Code Online (Sandbox Code Playgroud)

保留数字类型。