查找numpy数组构成的列表元素索引时出现多元素数组真值歧义报错
问题原因
Python 内置列表的index()方法执行查找时,会从左到右依次将列表元素和待查找目标做相等性校验:
- 第一个待查找对象
melbourneR本身就是列表的第一个元素,二者是同一个内存对象,Python 优先通过is身份校验匹配成功,直接返回索引0,不会触发后续的相等值判断。 - 查找
perthR时,方法会先将其和列表第一个元素melbourneR做相等判断,而两个 numpy 数组做==比较会返回一个布尔类型的数组,Python 无法将多元素的布尔数组直接转为单个布尔值用于相等判断,因此抛出对应的ValueError。
解决方案
- 方案1:按对象身份匹配(适用于列表元素都是预先定义的独立数组对象,不需要匹配内容相同的不同对象)
自己实现按身份校验的查找逻辑,避免触发 numpy 数组的逐值比较:
def find_index_by_identity(lst, target): for idx, item in enumerate(lst): if item is target: return idx raise ValueError(f"{target} not in list") # 调用示例 citiesR = [melbourneR, perthR, brisbaneR] print(find_index_by_identity(citiesR, melbourneR)) # 输出0 print(find_index_by_identity(citiesR, perthR)) # 输出1
- 方案2:按数组内容匹配(适用于需要匹配内容相同的不同数组对象的场景)
用numpy提供的np.array_equal()方法做数组内容的全等判断,实现查找:
import numpy as np def find_index_by_content(lst, target): for idx, item in enumerate(lst): if np.array_equal(item, target): return idx raise ValueError(f"{target} not in list") # 调用示例 print(find_index_by_content(citiesR, perthR))
内容的提问来源于stack exchange,提问作者Luke Hickinbotham
相关产品推荐
相关产品推荐

