Numpy - 直接使用np.isnan和保存布尔值在临时变量的区别

1 投票
1 回答
599 浏览
提问于 2025-04-18 02:02

我想从一个numpy数组中去掉NaN(不是一个数字)的值,举个例子:

A = np.array([[1,2,3,4,5,6],
       [1,2,3,4,5,6],
       [1,2,3,4,nan,6],
       [1,2,3,4,5,6],
       [1,2,3,4,5,6],
       [1,2,3,4,5,6],
       [1,2,nan,4,5,6],
       [1,2,3,4,5,6],
       [nan,2,3,4,5,6]])

我用一个直接的命令去掉它们,效果很好:

A1 = A[~np.isnan(A).any(1)]

但是如果我把布尔值(真或假)保存到一个临时数组里:

boolAnonan = ~np.isnan(A)  
A2 = A[boolAnonan.any(1)]

结果却没有任何变化!

实际上,我为什么会这样呢?:

>>> boolAnonan == ~np.isnan(A)
array([[ True,  True,  True,  True,  True,  True],
   [ True,  True,  True,  True,  True,  True],
   [ True,  True,  True,  True,  True,  True],
   [ True,  True,  True,  True,  True,  True],
   [ True,  True,  True,  True,  True,  True],
   [ True,  True,  True,  True,  True,  True],
   [ True,  True,  True,  True,  True,  True],
   [ True,  True,  True,  True,  True,  True],
   [ True,  True,  True,  True,  True,  True]], dtype=bool)

>>> ~np.isnan(A).any(1)
array([ True,  True, False,  True,  True,  True, False,  True, False], dtype=bool)

>>> boolAnonan.any(1)
array([ True,  True,  True,  True,  True,  True,  True,  True,  True], dtype=bool)

有没有什么合理的解释?谢谢!

1 个回答

1

你遇到了优先级的问题

~x.y.z

~(x.y.z)

不是

(~z).y.z

因此

~np.isnan(A).any(1)

并不等同于

(~np.isnan(A)).any(1)

撰写回答