检查python列表是否包含numpy数组时出现奇怪的、不一致的行为

检查python列表是否包含numpy数组时出现奇怪的、不一致的行为,python,numpy,Python,Numpy,因此,如果我这样做,没有问题: A = [[1,2,3],[4,5,6]] B = [1,2,3] B in A #=> True 但如果我这样做: A = [[1,2,3],[4,5,6]] A = [np.array(x) for x in A] A[0] in A #=> True z = np.array([1,2,3]) z in A #=> ValueError: The truth value of an array with more than one e

因此,如果我这样做,没有问题:

A = [[1,2,3],[4,5,6]]
B = [1,2,3]
B in A #=> True
但如果我这样做:

A = [[1,2,3],[4,5,6]]
A = [np.array(x) for x in A]

A[0] in A #=> True

z = np.array([1,2,3])
z in A #=> ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
我觉得这很令人困惑。z和A[0]都是相同数据类型的(3,)numpy数组,并且在任何地方都相等

这种行为有什么原因吗


谢谢。

所以这很微妙<中的code>最终将使用
==
来比较元素,这将产生一个布尔数组(带有所有true)。但是,
numpy
明确禁止在布尔上下文中使用数组。。。如错误消息中所述。因此,这是
numpy.ndarray
objet无法很好地处理普通python数据结构的一种方式

但是(这是一个实现细节)
列表。包含将由
中的
调用的
将在
==
之前使用
is
来测试成员资格。因此,它将返回
True
,而不尝试在布尔上下文中使用数组,因为

A[0] is A[0]
尽管,请注意,我实际上不确定它是否应该被视为一个实现细节,因为它就在:

对于容器类型,如
列表
元组
冻结集
dict
collections.deque
,y中的表达式
x
是等效的 到
any(x是e或x==e表示y中的e)

看看其他实现,例如pypy或Jython是否也能做到这一点,这会很有趣

从根本上说,Python假定
x是y
意味着
x==y
,尽管有些内置类型违反了这一点,可能最明显的是,
float
对象,尤其是
float('nan')
。考虑:

>>> data = [float('nan'), 1., 2., 3.]
>>> data
[nan, 1.0, 2.0, 3.0]
>>> float('nan') in data
False
>>> data[0] in data
True
>>> data[0] == data[0]
False
>>> data[0] is data[0]
True

嗯,我用谷歌搜索了错误,我大体上理解你的观点。但是为什么[0]会出现在作品中呢?啊,我明白了,重新打开并回答。很酷,这很有趣。谢谢你阅读我的问题:P