Numpy - 直接使用np.isnan和保存布尔值在临时变量的区别
我想从一个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)