【问题标题】:Finding whether a list contains a particular numpy array查找列表是否包含特定的 numpy 数组
【发布时间】:2013-07-17 14:41:55
【问题描述】:
import numpy as np

a = np.eye(2)
b = np.array([1,1],[0,1])

my_list = [a, b]

a in my_list 返回true,但b in my_list 返回“ValueError:具有多个元素的数组的真值不明确。使用a.any() 或a.all()”。我可以通过先将数组转换为字符串或列表来解决这个问题,但是有没有更好(更 Pythonic)的方法呢?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    问题在于,在 numpy 中,== 运算符返回一个数组:

    >>> a == b
    array([[ True, False],
           [ True,  True]], dtype=bool)
    

    您使用 .array_equal() 将数组与纯布尔值进行比较。

    >>> any(np.array_equal(a, x) for x in my_list)
    True
    >>> any(np.array_equal(b, x) for x in my_list)
    True
    >>> any(np.array_equal(np.array([a, a]), x) for x in my_list)
    False
    >>> any(np.array_equal(np.array([[0,0],[0,0]]), x) for x in my_list)
    False
    

    【讨论】:

    • 如果我检查第一个值(如上面的a in my_list)由于短路而成功的原因是:如果数组中的每个元素在第一次检查时都是真的,它不会检查列表的其余部分?
    • @ChrisMidgley:是的,它是短路的(顺便说一句,any() 函数也是短路的)。此外,如果所有元素都为 True,则布尔值为 True 是明确的。但如果它是 True 和 False 的混合,那么 NumPy 无法决定隐式转换,从而引发错误。
    【解决方案2】:

    有关该问题的更多信息。如果你用

    形成 my_list
    my_list = [b,a] 
    

    失败的是一个……有趣的问题。

    【讨论】:

    • 如果您想知道原因,请查看/google PyObject_RichCompareBool 的文档。
    猜你喜欢
    • 2020-11-13
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    相关资源
    最近更新 更多