You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用DBSCAN将图像异常值设为黑色时遇TypeError问题求助

问题修复:DBSCAN图像聚类时的TypeError错误

错误原因分析

你遇到的TypeError: 'int' object is not subscriptable错误,根源在于两处代码问题:

  1. 变量缩进错误:mDBSCAN函数中clusterlabels的定义被写在函数外部,成为全局变量,导致创建数组时使用的length和breadth并非函数内的图像维度,数组维度完全不符合预期。
  2. 数组维度冗余:即使缩进正确,你创建的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:55:24