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

实现Deep Embedded Clustering算法时遇ValueError解包值过多问题

Deep Embedded Clustering算法运行报错:ValueError: too many values to unpack

我在实现Deep Embedded Clustering算法时,用仓库里的代码跑起来出现了ValueError: too many values to unpack错误,报错位置在acc函数的return行。试过用zip函数、先赋值再返回的办法,问题还是没解决。

相关代码如下:

def acc(y_pred, y_target):
    D = max(y_pred.max(), y_target.max()) + 1
    w = np.zeros((D, D), dtype=np.int64)
    for i in range(y_pred.size):
        w[y_pred[i], y_target[i]] += 1

    ind = linear_assignment(w.max() - w)
    return sum(w[i, j] for i, j in ind) * 1.0 / y_pred.size # <- 错误行

问题原因

这个错误的核心是linear_assignment函数的返回格式和代码预期不匹配。不管是旧版scipy里的linear_assignment,还是新版替代它的linear_sum_assignment,返回的都是两个独立的一维数组(分别对应匹配后的行索引和列索引),但代码里默认ind是由(i,j)元组组成的可迭代对象,循环解包时自然会报错。

解决办法

有两种简单的修改方式:

  • 方式一:转成元组对列表
    先把返回的两个索引数组拆出来,再用zip打包成元组对:

    # 替换原来的ind赋值行
    row_ind, col_ind = linear_assignment(w.max() - w)
    ind = list(zip(row_ind, col_ind))
    
  • 方式二:直接转置索引数组
    利用数组转置,把两个索引数组变成每行对应一个(i,j)对的二维数组:

    # 替换原来的ind赋值行
    ind = linear_assignment(w.max() - w).T
    

两种方式都能让后续的sum(w[i,j] for i,j in ind)正常执行,解决解包错误。

内容的提问来源于stack exchange,提问作者Mark McAllister

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 06:48:19