python数组列表_python – 如何搜索数组列表

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

from numpy import array

a = array([0, 1])

b = array([1, 0])

l = [a,b]

然后找到正确的索引给出

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通过比较各个值来返回数组而不是布尔值.这里它给出了数组([True,True],dtype = bool),它不能直接转换为布尔值,因此错误.

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

但对于任何其他元素,与第一个元素的标识为false,并且相等性测试会导致错误. (感谢Ashwini Chaudhary对评论的好解释).

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

d = array([0,1])

l.index(d)

它给出了相同的错误,因为标识是错误的,并且相等测试会引发错误.

这意味着您不能依赖任何使用比较的列表方法(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值