使用DBSCAN将图像异常值设为黑色时遇TypeError问题求助
问题修复:DBSCAN图像聚类时的TypeError错误
错误原因分析
你遇到的TypeError: 'int' object is not subscriptable错误,根源在于两处代码问题:
- 变量缩进错误:
mDBSCAN函数中clusterlabels的定义被写在函数外部,成为全局变量,导致创建数组时使用的length和breadth并非函数内的图像维度,数组维度完全不符合预期。 - 数组维度冗余:即使缩进正确,你创建的
clusterlabels是三维数组(每个像素对应一个单元素数组),但主代码中你将其当作二维数组使用,最终导致访问clusters[a][aa]时得到的是int值,后续的下标操作自然报错。
修复步骤
1. 修正mDBSCAN函数内的clusterlabels定义
将clusterlabels的创建代码缩进至函数内部,并改为二维数组,直接存储int类型标签:
import numpy as np def mDBSCAN(fun,dataset,eps,minpts): dbscan_dataset_array = dataset length = len(dbscan_dataset_array) breadth = len(dbscan_dataset_array[0]) # 创建二维int数组,替代原三维数组 clusterlabels = np.zeros((length, breadth), dtype=int) c = 0 # 后续聚类逻辑保持不变(注意缩进) for p in range(0,length): for pp in range(0,breadth): if (clusterlabels[p][pp] == 0): neighbours_of_p = checkNeighbours(fun,dbscan_dataset_array,p,pp,eps) if ((len(neighbours_of_p[0]))/2 >= minpts): c += 1 clusterlabels[p][pp] = c seeds = neighbours_of_p expandCluster(fun,dbscan_dataset_array,seeds,clusterlabels,c,eps,minpts) else: clusterlabels[p][pp] = -1 return c,clusterlabels
2. 修正expandCluster函数中的标签访问
因为现在clusterlabels是二维数组,原代码中的clusterlabels[currentseedp][currentseedpp]已经是int值,直接使用即可,无需修改(原代码这部分逻辑是对的)。
3. 主代码无需额外修改
主代码中clusters[a][aa] == -1的判断现在可以正常执行,因为clusters是二维数组,每个元素都是int类型。
验证说明
修改后,clusterlabels会是一个与图像尺寸匹配的二维数组,每个像素位置存储对应的聚类标签(-1表示异常值,正整数表示聚类ID),主代码中访问clusters[a][aa]会直接得到int值,不会再触发下标错误,异常值转黑色的逻辑可以正常运行。
内容的提问来源于stack exchange,提问作者Python
相关产品推荐
相关产品推荐

