Python查找列表中数组的索引

4

我手头有一个列表,其中的元素是像这样的数组:

([1,2,3],[4,5,6],[7,8,9])

我想要的是在这个列表中找到一个元素的索引,类似于:

list.index([4,5,6]) #should return 1.

问题在于,如果您不加上(A==B).all()这样的语句,numpy数组比较会出现错误。但是因为此比较位于索引函数内部,所以我不能并且也不想将all()添加到函数中。有没有更简单的解决方法呢?

让问题更清晰。哪些是Python列表,哪些是numpy数组?它们并不相同。不要混合使用。而你正在寻找的东西 - 它总是一个子列表或行(数组的)吗? - hpaulj
1
我几个月前回答了这个问题,并进行了一些时间测试:http://stackoverflow.com/a/25944486/901925 - hpaulj
我已经看了一下,但出于某种原因它不起作用。我得到的错误是ValueError: 数组的真值有多个,使用a.any()或a.all()。我认为这个错误与索引函数内的比较有关。我尝试在Python列表和NumPy数组之间进行转换(回答之前的问题,要搜索的位置是一个数组列表,要搜索的内容是一个数组。但无论哪个是哪个,因为我可以在它们之间进行转换。问题是当我将所有内容转换为列表时仍然会出现错误。 - Mad Program
这个错误意味着a==b的一侧或两侧是一个numpy数组,因此结果也是一个数组。但是这个表达式出现在Python期望标量布尔值的地方。建议您将代码分成小块进行测试。 - hpaulj
当应用 == 测试时,列表索引期望标量值。 - hpaulj
2个回答

8

您最近的错误信息显示您仍在混合使用列表和数组。我将尝试重新创建此情况:

创建一个列表的列表。查找子列表可以很好地完成:

In [256]: ll=[[1,2,3],[4,5,6],[7,8,9]]
In [257]: ll.index([4,5,6])
Out[257]: 1

将它转换为数组 - 它是二维的。

In [258]: la=np.array(ll)
In [259]: la
Out[259]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

它没有索引方法

In [260]: la.index([4,5,6])
...
AttributeError: 'numpy.ndarray' object has no attribute 'index'

将其转换为列表 - 但我们遇到了ValueError错误:

In [265]: list(la).index([4,5,6])
...
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

这是因为list(la)返回一个数组列表,而数组在==表达式中会产生多个值:

In [266]: list(la)
Out[266]: [array([1, 2, 3]), array([4, 5, 6]), array([7, 8, 9])]

从数组生成列表的正确方法是使用tolist,它会返回原始的ll列表:

In [267]: la.tolist().index([4,5,6])
Out[267]: 1

1
如果你使用的是numpy数组,那么在使用index()函数之前,可以将其转换为列表的列表以获得想要的结果,例如:
import numpy as np

arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
lst = [list(x) for x in arr]
print (lst.index([4,5,6]))

...这将产生预期的输出1


3
arr.tolist() == lst - hpaulj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接