创建一个布尔数组,将NumPy元素与None进行比较。

12

我有一个 dtype=object 的 numpy 数组,我想创建一个布尔数组来确定哪些元素是 None。但看起来 None 表现不同...

a = np.array(['Duck','Duck','Duck','Goose',None,1,2,3,1,3,None,4])
print a == 'Duck'
print a == 3
print a == None

导致

[ True  True  True False False False False False False False False False]
[False False False False False False False  True False  True False False]
False

有没有一种“numpythonic”方式来获取 None 元素的布尔数组?我可以使用

np.array([x is None for x in a])

但这似乎应该有更好的方法。


1
绝对没想到ndarrays会因为None表现不同... 很好的发现! - SethMMorton
特别是因为NumPy文档中的这句话:“每个算术运算(+,-,*,/,//,%,divmod(),**或pow(),<<,>>,&,^,|,〜)和比较(==,<,>,<=,>=,!=)都等同于Numpy中相应的通用函数(或简称ufunc)。 ”我只能假设np.equal==的ufunc。 - SethMMorton
1个回答

13
你可以使用numpy.equal函数:
In [20]: np.equal(a, None)
Out[20]: 
array([False, False, False, False,  True, False, False, False, False,
       False,  True, False], dtype=bool)

这绝对是一个好的解决方法,但你知道为什么它对 None 不起作用吗?Numpy文档说 == 应该匹配它的ufunc等效物,我想 equal 就是匹配的ufunc。 - SethMMorton
2
@SethMMorton 在 Github 上找到了一个相关的问题:== None 似乎对数组执行 is None 而不是返回逐个元素比较 #3759 - Ashwini Chaudhary
太棒了...我猜这就解决了为什么(是个bug)。谢谢! - SethMMorton
1
== None 的比较将在当前版本中产生 FutureWarning: comparison to 'None' will result in an elementwise object comparison in the future.None 是唯一会出现这种情况的例外,但这将得到修复。 - sebix

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