调用Gower距离函数遇TypeError类型不匹配错误求助
问题分析与修复方案
我来帮你拆解这个问题——其实核心是数据类型不匹配的小坑,在你减少特征之后暴露出来了。
为什么减少特征会触发错误?
先看报错信息的关键部分:TypeError: ufunc 'true_divide' output (typecode 'd') could not be coerced to provided output parameter (typecode 'q')
这里的'd'代表浮点数(float64),'q'代表整数(int64)。原因很简单:
- 你之前的数据集包含更多特征,其中应该混合了整数和浮点类型的特征,所以函数里处理数值特征的
X_num数组是浮点类型,np.zeros_like(X_num)生成的也是浮点数组,除法后的浮点数结果可以正常存入。 - 但减少特征后,剩下的所有数值特征都是整数类型,导致
X_num变成了整数数组,np.zeros_like(X_num)生成的也是整数数组。而np.divide执行除法必然会输出浮点数,Python的same_kind类型转换规则不允许把浮点数强行存入整数数组,所以直接报错了。
两种快速修复方法
方法1:在调用函数前转换数据类型
在传入gower_distances之前,把你的输入数组X转换成浮点类型,这样函数内部的X_num也会是浮点数组,类型就匹配了:
# 转换X为float64类型后再传入 Gower = gf.gower_distances(X.astype(np.float64))
方法2:修改gower_function.py的代码
找到报错的第184行,把生成输出数组的部分改成强制浮点类型,不管输入是整数还是浮点都能适配:
# 替换原来的行,明确指定dtype为float64 X_num = np.divide(X_num ,max_of_numeric,out=np.zeros_like(X_num, dtype=np.float64), where=max_of_numeric!=0)
验证你的数据集类型
你可以先确认一下现在的X数据类型,验证这个分析:
print(X.dtype)
如果输出是int64,就完全符合我们的判断——之前的数据集因为有浮点特征,X.dtype是float64,所以没触发这个问题。
内容的提问来源于stack exchange,提问作者Beg
相关产品推荐
相关产品推荐

