数组列表的成员资格:ValueError:具有多个元素的数组的真值不明确。使用a.any()或a.all()错误问题

COT*_*THE 4 python valueerror

Q = [np.array([0, 1]), np.array([1, 2]), np.array([2, 3]), np.array([3, 4])]
for q in Q:
    print(q in Q)
Run Code Online (Sandbox Code Playgroud)

运行上面的代码,它在第一次迭代时给出结果“True”,而随后出现 ValueError。

真的

ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

我不知道为什么它在第二次迭代时开始出错。任何人都可以帮助我plz..

Mar*_*ers 5

本质上,您不能用来in测试 Python 列表中的 numpy 数组。由于 Python 测试相等性的方式进行了优化,它只适用于第一个元素。

list.__contains__正在发生的事情是(遵循)的实现in是使用快捷方式通过首先检查identity来更快地找到匹配项。大多数使用 Python 的人都知道它是运算is。这比==相等检查更快,因为所is要做的就是查看两个对象的指针是否具有相同的值,值得首先检查。身份测试对于任何 Python 对象(包括 numpy 数组)都是一样的。

如果用 Python 编写,则实现基本上如下所示:

def __contains__(self, needle):
    for elem in self:
        if needle is elem or needle == elem:
            return True
    return False
Run Code Online (Sandbox Code Playgroud)

那么你的 numpy 数组列表会发生什么:

  • for q in Q, 步骤1:q = Q[0]

    • q in Q那么就等于Q.__contains__(Q[0])
      • Q[0] is self[0]=> True
  • for q in Q, 第2步:q = Q[1]

结果array([False, False])不是boolean,但if想要 boolean 结果,因此它被传递给(相当于 C 语言的)bool()functionbool(array([False, False]))产生您看到的错误。

或者,手动完成:

>>> import numpy as np
>>> Q = [np.array([0, 1]), np.array([1, 2]), np.array([2, 3]), np.array([3, 4])]
>>> Q[0] is Q[0]
True
>>> Q[1] is Q[0]
False
>>> Q[1] == Q[0]
array([False, False])
>>> bool(Q[1] == Q[0])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Run Code Online (Sandbox Code Playgroud)

您必须使用any()numpy.array_equal()创建一个list.__contains__不使用(正常)==相等检查的版本:

def list_contains_array(lst, arr):
    return any(np.array_equal(arr, elem) for elem in lst)
Run Code Online (Sandbox Code Playgroud)

然后你可以用它来获取True你的循环:

>>> for q in Q:
...     print(list_contains_array(Q, q))
...
True
True
True
True
Run Code Online (Sandbox Code Playgroud)