4

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

例如,a只有在相同位置的值等于 0 时才应保留 in 中的值b,否则返回为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 语句的情况下完成一些事情,因为这将适用于非常大的数组。我错过了什么?

4

2 回答 2

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)

我建议用NaN代替?

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

保留数字类型。

于 2018-03-23T16:11:19.243 回答
1

如果您需要就地解决方案,您可以转换为afloat然后使用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.])
于 2018-03-23T16:19:41.443 回答