Python相似图像检索脚本报TypeError: 仅整数标量数组可转标量索引错误
错误核心原因
触发这个报错的本质是给Python原生列表传了不符合要求的索引值。
具体到你的代码场景:
img_paths是Python原生list,它只接受Python原生的int类型标量做索引值ids是numpy数组类型,哪怕是整数数组,只要遍历出来的元素是numpy非标量、或者类型是numpy的数值类型(比如np.int64),或者本身维度没对齐成1维的单个值,拿它当list的索引就会直接抛出上述TypeError。
排查与修复步骤
- 先在报错行前加调试代码确认
ids的实际状态:
插入代码:print(type(ids), ids.shape, ids.dtype, ids[0] if len(ids) >0 else "empty")
正常的索引数组应该是1维的,输出类似<class 'numpy.ndarray'> (30,) int64 2;如果shape显示为2维(比如(1,30)),说明你前面计算距离时features和query的维度没对齐,导致排序返回的是嵌套的二维数组,遍历出来的每个元素本身就是一个数组,根本没法当单个索引值用。 - 场景1:调试后确认
ids是正常1维、元素为整数的numpy数组
只需要把每个索引强制转换成Python原生int类型,修改报错行的代码即可:scores = [img_paths[int(id)] for id in ids] - 场景2:调试发现
ids是二维/嵌套结构
先把数组展平成1维再做取值:ids = np.argsort(dists)[:30].flatten() scores = [img_paths[int(id)] for id in ids]
代码冗余优化
你当前FeatureExtractor初始化部分的代码存在冗余:
- 前面基于VGG16搭建带自定义全连接层、编译模型的逻辑完全没有被实际使用,后面又重新初始化了一个只取VGG16最后一层卷积输出的模型作为
self.model,前面的Dense、Dropout、Adam编译相关的代码都可以直接删掉,减少不必要的模型加载耗时。 - 如果不想单独处理索引类型,也可以用numpy原生的取值逻辑遍历,规避非原生int类型的索引兼容问题:
scores = [img_paths[i] for i in np.nditer(ids)]np.nditer会强制把每个索引值转成单个标量再返回,不会出现嵌套数组当索引的问题。
内容的提问来源于stack exchange,提问作者Jkaoutar
相关产品推荐
相关产品推荐

