import numpy as np
mainList = []
numpyArray0 = np.array([1,2,3])
numpyArray1 = np.array([4,5,6])
mainList.append(numpyArray0)
mainList.append(numpyArray1)
print("numpyArray0 in mainList:")
try:
print(numpyArray0 in mainList)
except ValueError:
print("ValueError")
print("numpyArray1 in mainList:")
try:
print(numpyArray1 in mainList)
except ValueError:
print("ValueError")
print("mainList in numpyArray0:")
try:
print(mainList in numpyArray0)
except ValueError:
print("ValueError")
print("mainList in numpyArray1:")
try:
print(mainList in numpyArray1)
except ValueError:
print("ValueError")
print(numpyArray1 in mainList)
所以我上面的代码基本上是在一个普通的python列表(mainList)内创建2个numpy数组,然后检查这些2个数组是否在列表内。该代码应输出:
numpyArray0 in mainList:
True
numpyArray1 in mainList:
**True**
mainList in numpyArray0:
True
mainList in numpyArray1:
True
**True**
但不是输出以上内容,而是输出以下内容:
numpyArray0 in mainList:
True
numpyArray1 in mainList:
ValueError
mainList in numpyArray0:
True
mainList in numpyArray1:
True
Traceback (most recent call last):
File "/home/user/Documents/pythonCode/temp.py", line 31, in <module>
print(numpyArray1 in mainList)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
我做错了什么吗? 请注意,在运行代码之前,我尝试更新python,numpy和os(debian)。
答案 0 :(得分:4)
numpyArray0 in mainList
呼叫list.__contains__
。列表的__contains__
方法对列表的每个元素调用PyObject_RichCompareBool
,以检查元素是否相等。碰巧,PyObject_RichCompareBool
首先检查身份相等性,然后进行全面比较。
numpyArray0 is mainList[0]
返回True
,因此永远不会进行完全比较。如果进行了完全比较,则numpy
将引发ValueError
,因为无法将numpy
数组解释为布尔值。
numpyArray1 in mainList
也表明了这一点(因为numpyArray1
与mainList[0]
的身份比较失败。
答案 1 :(得分:2)
它似乎是sonarqube,与==
运算符对Numpy数组的重载方式有关。
答案 2 :(得分:0)
这里要点:
>>> numpyArray1 in mainList
....
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
这将起作用:
>>> any([list(numpyArray1) == list(litem) for litem in mainList])
True
答案 3 :(得分:0)
将相同的操作与列表而不是 numpy数组进行比较:
In[171]: mainList = []
In[172]: list0 = [1,2,3]
In[173]: list1 = [4,5,6]
In[174]: mainList.append(list0)
In[175]: mainList.append(list1)
In[176]: list0 in mainList
Out[176]: True
In[177]: list1 in mainList
Out[177]: True
我想以此显示什么?
两件事。
cache = [] cache.append(numpy.ndarray([1,2,3])) cache.append(numpy.ndarray([4,5,6])) numpy.ndarray([4,5,6]) in cache