问题 创建一个布尔数组,将numpy元素与None进行比较


我有一个带有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])

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


12798
2017-09-25 22:27


起源

一世 无疑 不会期望ndarray表现出不同的行为 None... 接得好! - SethMMorton
...特别是因为来自NumPy文档的引用: “每个算术运算(+, - ,*,/,//,%,divmod(),**或pow(),<<,>>,&,^,|,〜)和比较(= =,<,>,<=,> =,!=)相当于Numpy中相应的通用函数(或简称为ufunc)。“ 我只能假设 np.equal 是ufunc for ==。 - SethMMorton


答案:


您可以使用 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)

12
2017-09-25 22:36



这肯定是一个很好的解决方法,但你知道它为什么不起作用 None? numpy docs说 == 应该匹配它的ufunc等价物,我想象 equal 是匹配的ufunc。 - SethMMorton
@SethMMorton在Github上找到相关的票: == None 似乎这样做 is None 对于数组而不是返回元素比较#3759 - Ashwini Chaudhary
真棒......我猜这解决了原因(这是一个错误)。谢谢! - SethMMorton
欢呼 - 非常感谢! - Jason S
与...比较 == None 应该给一个 FutureWarning: comparison to 'None' will result in an elementwise object comparison in the future. 在当前版本中。 None 是发生这种情况的唯一例外,但这将得到修复。 - sebix