gpt4 book ai didi

python - 如何搜索数组列表

转载 作者:太空宇宙 更新时间:2023-11-03 11:48:22 25 4
gpt4 key购买 nike

考虑以下两个数组的列表:

from numpy import array

a = array([0, 1])
b = array([1, 0])

l = [a,b]

然后正确找到a的索引给出

l.index(a)
>>> 0

虽然这对 b 不起作用:

l.index(b)
ValueError: The truth value of an array with more than one element is ambiguous.
Use a.any() or a.all()

在我看来,调用列表的 .index 函数不适用于 numpy 数组列表。

有人知道解释吗?到目前为止,我总是通过将数组转换为字符串来解决这个问题。有人知道更优雅、更快速的解决方案吗?

最佳答案

好问题实际上是 l.index[a] 如何返回正确的值。因为 numpy 数组以特殊方式处理相等性:l[1] == b 通过比较各个值返回一个数组而不是 bool 值。这里它给出了 array([ True, True], dtype=bool) 不能直接转换为 bool 值,因此错误。

事实上,Python 使用丰富的比较,特别是 PyObject_RichCompareBool将搜索到的值与列表中的每个元素进行比较是序列,这意味着它首先测试身份(a is b),然后是相等性(a == b)。因此对于第一个元素,因为 a 是 l[0],恒等式为真,返回索引 0。

但对于任何其他元素,与第一个元素的同一性是错误的,相等性测试会导致错误。 (感谢 Ashwini Chaudhary 在评论中的精彩解释)。

您可以通过测试包含与 l[0] 相同元素的数组的新副本来确认:

d = array([0,1])
l.index(d)

它给出了同样的错误,因为 identity 是假的,相等性测试引发了错误。

这意味着您不能依赖任何使用比较(index、in、remove)的列表方法,而必须使用自定义函数,例如@orestiss 提出的函数。或者,由于 numpy 数组列表似乎难以使用,您应该考虑包装数组:

>>> class NArray(object):
def __init__(self, arr):
self.arr = arr
def array(self):
return self.arr
def __eq__(self, other):
if (other.arr is self.arr):
return True
return (self.arr == other.arr).all()
def __ne__(self, other):
return not (self == other)


>>> a = array([0, 1])
>>> b = array([1, 0])
>>> l = [ NArray(a), NArray(b) ]
>>> l.index(NArray(a))
0
>>> l.index(NArray(b))
1

关于python - 如何搜索数组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33889323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com