Python numpy nan在带字符串的数组中与true进行比较

Python numpy nan在带字符串的数组中与true进行比较,python,arrays,numpy,Python,Arrays,Numpy,我试图比较两个numpy数组,它们包含数字、字符串和nan。我想知道数组中有多少项相等 比较这两个阵列时: c =np.array([1,np.nan]); d =np.array([2,np.nan]); print (c==d) [False False] 这是预期的行为 但是,在比较时: a =np.array([1,'x', np.nan]); b =np.array([1,'x', np.nan]); print (a==b) [ True True True] 这对我来说毫无

我试图比较两个numpy数组,它们包含数字、字符串和nan。我想知道数组中有多少项相等

比较这两个阵列时:

c =np.array([1,np.nan]);
d =np.array([2,np.nan]);
print (c==d)
[False False]
这是预期的行为

但是,在比较时:

a =np.array([1,'x', np.nan]);
b =np.array([1,'x', np.nan]);
print (a==b)
[ True  True  True]
这对我来说毫无意义,向数组中添加一个字符串怎么能改变比较NAN的方式呢?有什么想法吗


谢谢

如果检查数组,您将看到
np.nan
已转换为字符串(
'n'
):

而且
'n'=='n'
真的

我不明白的是,为什么将数组的
dtype
更改为
object
不会更改比较结果:

In [72]: a = np.array([1, 'x', np.nan], dtype=object)

In [73]: b = np.array([1, 'x', np.nan], dtype=object)

In [74]: a == b
Out[74]: array([ True,  True,  True], dtype=bool)

In [75]: a[2] == b[2]
Out[75]: False

In [76]: type(a[2])
Out[76]: float

In [77]: type(b[2])
Out[77]: float
这几乎就像两个NaN对象是通过引用而不是通过值进行比较的:

In [79]: id(a[2])
Out[79]: 26438340

In [80]: id(b[2])
Out[80]: 26438340

在numpy 1.9.1中,当比较
a
b
时,我会得到“未来警告:numpy equal将来不会检查对象标识。比较不会返回标识(
is
)所建议的相同结果,并且会更改。”。看起来这是一个已知的问题(功能?)。嗯,将
NaN
作为一个对象进行比较,我认为它是相等的。NaN作为浮点数应该总是错误的。但是现在不要很好地理解Numpy的内部特性。@sebix:恐怕我不理解您所做的区别,因为
float
object
的子类(请尝试
isinstance(float,object)
)。我假设对于对象数组,Numpy不会使用objects方法进行比较,但是像您假设的ID。@sebix:我可以证明情况并非如此:包含字符串的
dtype
of
object
数组使用字符串内容而不仅仅是ID来建立相等性。
In [79]: id(a[2])
Out[79]: 26438340

In [80]: id(b[2])
Out[80]: 26438340