在 numpy 中使用布尔数组进行过滤现在会引发 deprication 警告。如何避免这种情况以及为什么要进行此更改?

Filtering using a boolean array in numpy now raises a deprication warning. How to avoid this and why was this change made?

今天在使用 numpy 时,我写了几行代码从一个一维数组中提取元素,该数组中有几个不同的标识整数。我的过滤器是 fiveseventy_idx 但我收到了贬低警告。以后怎么办

    fiveseventy_idx = np.where(clusters == 1)
    clusters = clusters[fiveseventy_idx]

<ipython-input-44-fd1ca1277d36>:1: DeprecationWarning: elementwise comparison failed; this will raise an error in the future.
  fiveseventy_idx = np.where(clusters == [1,570])

假设 clusters = np.array([2, 4, 2, 7, 7, 7, 1, 1, 3, 570, 1,]),我只想要特定的整数,另一个数组需要我的过滤器,这样我就可以按照与以前相同的顺序获取关联值。所以我希望在应用我的过滤器后 [1,1,1]

比较 2 个不同长度的数组 - 结果是标量 False,以及警告:

In [146]: np.arange(10) == np.array([2, 5])
<ipython-input-146-888c04a597c2>:1: DeprecationWarning: elementwise comparison failed; this will raise an error in the future.
  np.arange(10) == np.array([2, 5])
Out[146]: False

所以它只是说 - 不,这 2 个数组不相等。通常 numpy 会进行元素比较。而且它可能会一次截断较长的数组以匹配较短的数组的大小。

无论如何,一个broadcasted比较:

In [147]: np.arange(10)[:, None] == np.array([2, 5])
Out[147]: 
array([[False, False],
       [False, False],
       [ True, False],
       [False, False],
       [False, False],
       [False,  True],
       [False, False],
       [False, False],
       [False, False],
       [False, False]])
In [148]: (np.arange(10)[:, None] == np.array([2, 5])).any(axis=1)
Out[148]: 
array([False, False,  True, False, False,  True, False, False, False,
       False])
In [149]: np.nonzero((np.arange(10)[:, None] == np.array([2, 5])).any(axis=1))
Out[149]: (array([2, 5]),)

有时 all 可用于测试是否在两列中捕获 True

另一种方式:

In [151]: np.isin(np.arange(10),np.array([2,5]))
Out[151]: 
array([False, False,  True, False, False,  True, False, False, False,
       False])

In [152]: (np.arange(10)==2)|(np.arange(10)==5)
Out[152]: 
array([False, False,  True, False, False,  True, False, False, False,
       False])