实现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
相关产品推荐
相关产品推荐

