NumPy布尔数组警告?

9
我有几个numpy数组,比如说a、b和c,并且创建了一个mask来应用于它们所有。我正在尝试使用以下方式进行掩蔽:
a = a[mask]
其中mask是一个bool数组。值得注意的是,我已经验证了 len(a) = len(b) = len(c) = len(mask)
并且我收到了一个听起来比较晦涩的警告:
FutureWarning: in the future, boolean array-likes will be handled as a boolean array index

1
该错误表明您正在尝试使用一个0维布尔数组作为索引。该操作的语义正在发生变化。您如何验证mask是具有len属性的对象? - user2357112
等等,不对,错误警告。你是否以某种方式获取了“掩码”的列表? - user2357112
1个回答

17

False等于0,True等于1。如果你的掩码是一个列表而不是ndarray,你可能会得到一些意想不到的行为:

>>> a = np.array([1,2,3])
>>> mask_list = [True, False, True]
>>> a[mask_list]
__main__:1: FutureWarning: in the future, boolean array-likes will be handled as a boolean array index
array([2, 1, 2])

这个数组由a[1]、a[0]和a[1]组成,就像...

>>> a[np.array([1,0,1])]
array([2, 1, 2])

另一方面:

>>> mask_array = np.array(mask_list)
>>> mask_array
array([ True, False,  True], dtype=bool)
>>> a[mask_array]
array([1, 3])

这个警告是在告诉你,最终 a[mask_list] 将会和 a[mask_array] 一样(这也可能是你一开始希望得到的结果)。


1
啊,非常感谢,很有道理。通过将列表转换为numpy数组进行修复,使用mask = np.array(mask_expression, dtype=bool) - pretzlstyle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接