numpy 类型错误:无法将ufunc“true_divide”输出(类型代码“d”)强制为提供的输出参数(类型代码“q”)

hpcdzsge  于 2023-03-30  发布在  其他
关注(0)|答案(3)|浏览(207)

我试图将Gower距离实现应用到我的 Dataframe 。虽然它可以顺利地处理具有更多特征的相同数据集,但这次当我调用Gower距离函数时,它会出错。我从同一目录中的另一个.py代码导入Gower的函数。下面是我的代码:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

import gower_function as gf

# Importing the dataset with pandas
dataset = pd.read_excel('input_partial.xlsx')
X = dataset.iloc[:, 1:].values
df = pd.DataFrame(X)
#obtaining gower distances of instances
Gower = gf.gower_distances(X)

在执行这个命令后,我得到了下面的错误:

File "<ipython-input-10-6a4c39600b0e>", line 1, in <module>
Gower = gf.gower_distances(X)

File "C:\Users\...\Clustering\Section 24 - K-Means 
Clustering\gower_function.py", line 184, in gower_distances
X_num = np.divide(X_num ,max_of_numeric,out=np.zeros_like(X_num), 
where=max_of_numeric!=0)

TypeError: ufunc 'true_divide' output (typecode 'd') could not be coerced to 
provided output parameter (typecode 'q') according to the casting rule 
''same_kind''

我不明白它是如何在只有较少特征(列)的同一数据集上给予此错误的。有没有人能认识到原因?

r8uurelv

r8uurelv1#

您需要指定左操作数的dtype为非整数,一些浮点类型,例如。

a = np.array ( ... , dtype = float )
np.divide ( a , b , out = np.zeros_like ( a ) , where = b != 0)

如果ab中的dtype都是整数,那么得到的错误是:ufunc true_divide没有找到匹配指定签名和转换的循环
如果a中的dtype是整数,但b是浮点数,那么得到的错误是:根据强制转换规则“same_kind”,无法将ufunc“true_divide”输出(类型代码“d”)强制为提供的输出参数(类型代码“l”)

qzwqbdag

qzwqbdag2#

我也遇到了同样的问题。看起来如果你所有的变量都是整数,那么它就会产生这个错误。所以我把每个整数列都改成了字符串值。

cluster_data = cluster_data.astype(str)
cluster_data.dtypes.head()

这似乎修复了错误。

ljo96ir5

ljo96ir53#

np.zeros_like(a)创建一个与a具有相同dtype的数组,如果它被用作out=的numpy操作(如np.dividenp.lognp.exp等)产生一个浮点数组,则dtype将不匹配;因此出现了错误。解决这个问题的一种方法是使用np.zeros(a.shape)

a = b = np.random.default_rng().choice(10, size=1000000)
np.divide(a, b, out=np.zeros_like(a), where=b!=0)       # UFuncTypeError
np.divide(a, b, out=np.zeros(a.shape), where=b!=0)      # OK

或者将传递给zeros_like的数组的dtype更改为float(如Dan Oak所建议的)。

X = dataset.iloc[:, 1:].values.astype(float)

相关问题