在集合和元组中比较Numpy数据类型?

3

所以,我遇到了一个奇怪的问题:判断一个集合(set)是否包含一个Numpy数据类型对象与判断一个元组(tuple)是否包含该对象会得到不同的结果:

In [1]: x = np.zeros(8)

In [2]: x.dtype
Out[2]: dtype('float64')

In [3]: x.dtype in (np.float32, np.float64)
Out[3]: True

In [4]: x.dtype in {np.float32, np.float64}
Out[4]: False

为什么会发生这种情况?是什么阻止set().__contains__()在查看numpy.dtype对象时返回True

有趣.. x.dtype in {np.float32, np.float64, np.dtype('float64')} 这个起作用了.. 但我也想知道为什么会这样.. - sharathnatraj
3
我怀疑set使用的是is测试,而元组(或列表)使用了更宽松的==测试。float64实际上是一个函数(类型为type)。np.dtype('float64')是一个dtype对象。 - hpaulj
是的,看起来是这样的, 对于 x = 1.0print(type(x) in {npa.float32, np.float64}) print(isinstance(1.0, (np.float64,np.float32))) 返回 False 然而, print(type(x) in {float, np.float32, np.float64}) print(isinstance(1.0, (float, np.float32, np.float64))) 返回 True。 - sharathnatraj
@sharathnatraj,他正在测试数组的dtype,而不是Python floattype - hpaulj
当然,我只是在我的测试中使用Python的“float”作为例子。对于“numpy”数组的“dtype”,行为也是相同的。这只是为了看到set是否使用了“isinstance()”类型的测试。 - sharathnatraj
1个回答

2

检查集合成员资格使用的是__hash__()而不是__eq__()。在这种情况下,它只是简单地表明这些对象彼此相等,但生成了不同的哈希值:

In [1]: np.float64 == np.dtype(np.float64)
Out[1]: True

In [2]: hash(np.float64)
Out[2]: 8793996338852

In [3]: hash(np.dtype(np.float64))
Out[3]: -7365930899603730638

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