臭虫? (python3)

时间:2018-08-22 22:27:09

标签: python numpy

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)。

4 个答案:

答案 0 :(得分:4)

numpyArray0 in mainList呼叫list.__contains__。列表的__contains__方法对列表的每个元素调用PyObject_RichCompareBool,以检查元素是否相等。碰巧,PyObject_RichCompareBool首先检查身份相等性,然后进行全面比较。

numpyArray0 is mainList[0]返回True,因此永远不会进行完全比较。如果进行了完全比较,则numpy将引发ValueError,因为无法将numpy数组解释为布尔值。

numpyArray1 in mainList也表明了这一点(因为numpyArray1mainList[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

我想以此显示什么?

两件事。

  1. OP问题的正确答案是DYZ,而不是Alok Singhal
  2. OP问题可疑地类似于所报告的错误。与Python member operation does not work on lists because of overloaded ndarray equality #10400中报告的问题的这一部分进行比较:
cache = []
cache.append(numpy.ndarray([1,2,3]))
cache.append(numpy.ndarray([4,5,6]))
numpy.ndarray([4,5,6]) in cache