我手头有一个列表,其中的元素是像这样的数组:
([1,2,3],[4,5,6],[7,8,9])
我想要的是在这个列表中找到一个元素的索引,类似于:
list.index([4,5,6]) #should return 1.
问题在于,如果您不加上
(A==B).all()
这样的语句,numpy
数组比较会出现错误。但是因为此比较位于索引函数内部,所以我不能并且也不想将all()
添加到函数中。有没有更简单的解决方法呢?您最近的错误信息显示您仍在混合使用列表和数组。我将尝试重新创建此情况:
创建一个列表的列表。查找子列表可以很好地完成:
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
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
。
arr.tolist() == lst
- hpaulj
numpy
数组?它们并不相同。不要混合使用。而你正在寻找的东西 - 它总是一个子列表或行(数组的)吗? - hpaulja==b
的一侧或两侧是一个numpy数组,因此结果也是一个数组。但是这个表达式出现在Python期望标量布尔值的地方。建议您将代码分成小块进行测试。 - hpaulj==
测试时,列表索引期望标量值。 - hpaulj