当列表中有np. NaN时,逻辑OR和逻辑AND似乎不起作用。我举了一个简单的例子:如果我用np.NaN填充ndarray,它就不能正常工作:
import numpy as np
m =10
l1, l2 = np.array([np.NaN] * m), np.array([np.NaN] * m)
l1[3] = 5
l2[3] = 5
l1[5] = 6
l2[5] = 6
l2[7] = 7
l1[8] = 8
mask1 = (l1 != np.NaN) & (l2 != np.NaN)
mask0 = (l1 == np.NaN) | (l2 == np.NaN)
print("Lists:")
print(l1)
print(l2)
print()
print("Masks:")
print(mask1)
print(mask0)
它打印:
Lists:
[nan nan nan 5. nan 6. nan nan 8. nan]
[nan nan nan 5. nan 6. nan 7. nan nan]
Masks:
[ True True True True True True True True True True] # not true
[False False False False False False False False False False] # not true
我期望:
Masks:
[False False False True False True False False False False]
[ True True True False True False True True True True]
我做了一个测试,我改变了np.NaN为None,这解决了一个逻辑操作的问题,但是在我的代码中,我从列表中计算项目,我必须将项目与值进行比较。然后我得到TypeError:
TypeError:“NoteType”和“int”的示例之间不支持“<”
如何将所有np.NaN更改为None?
3条答案
按热度按时间lymnna711#
不能使用==和!= on np.nan值nan不等于nan
here一些深刻的解释
在算法中引入np.isnan()
bakd9h0s2#
我觉得很简单。
v09wglhw3#
让我们更详细地探讨替代方案
您的阵列(类似
l2
)使用
isnan
测试:并将它们组合:
由于
nan
传播,我们可以在l1==l2
相当于测试l1-l2
是否为0。我可以运行一些
timeit
测试,但对于如此小的数组,它们不会告诉我们很多。np.isnan
是一个numpy编译的函数,速度足够快。nan
的独特之处在于它永远不等于自身。加强你的真或假数组。使用
None
创建数组,创建一个对象dtype(非浮点型)None
与只有一个None
不同,因此is/==
为真,但大小比较没有意义np.isnan
不能在这个l11
对象dtype数组上运行,因为它需要浮点数我相信
pandas
有一些比np.isnan
更广泛的测试,但我没有在这台计算机上安装。