我的代码是下一个
data_temp = [(atributos[0],atributos[1],atributos[2],atributos[3],atributos[4],atributos[5],atributos[6],atributos[7],atributos[8],atributos[9],atributos[10],atributos[11],atributos[12],atributos[13])]
lectura = csv.reader(open("Dataset.csv","r"))
dis = [] #creamos una lista vacia para almacenar las distancias de cada instancia
for index,row in enumerate(lectura):
dato2 = [float(row[0]), float(row[1]),float(row[2]), float(row[3]),float(row[4]),float(row[5]),float(row[6]),float(row[7]),float(row[8]),int(row[9]),int(row[10]),int(row[11]),int(row[12]),int(row[13])]
d = calcular_distancia(data_temp,dato2)
,错误是
def calcular_distancia(d1,d2):
distancia = ((d1[0]-d2[0])**2+(d1[1]-d2[1])**2+(d1[2]-d2[2])**2+(d1[3]-d2[3])**2+(d1[4]-d2[4])**2+(d1[5]-d2[5])**2+(d1[6]-d2[6])**2+(d1[7]-d2[7])**2+(d1[8]-d2[8])**2+(d1[9]-d2[9])**2+(d1[10]-d2[10])**2+(d1[11]-d2[11])**2+(d1[12]-d2[12])**2+(d1[13]-d2[13])**2)
return math.sqrt(distancia)
并使用
完成程序distancia = ((d1[0]-d2[0])**2+(d1[1]-d2[1])**2+(d1[2]-d2[2])**2+(d1[3]-d2[3])**2+(d1[4]-d2[4])**2+(d1[5]-d2[5])**2+(d1[6]-d2[6])**2+(d1[7]-d2[7])**2+(d1[8]-d2[8])**2+(d1[9]-d2[9])**2+(d1[10]-d2[10])**2+(d1[11]-d2[11])**2+(d1[12]-d2[12])**2+(d1[13]-d2[13])**2)
TypeError: unsupported operand type(s) for -: 'tuple' and 'float'
答案 0 :(得分:0)
您的d1和d2变量不是浮点数列表。相反,他们是一个元组列表。在您的代码中某些地方,您还没有显示,d1 [i]和d2 [i]被赋予元组值。
另外,要计算距离,我会执行以下操作:如果您有2个浮动列表。 将索引映射到d1和d2平方中相应索引的差值。然后求和平方差异列表。它有助于减少你的长期总结。
return math.sqrt(sum( list(map(lambda i: (d1[i] - d2[i])**2, range(len(d1))))))
答案 1 :(得分:0)
看起来您将一个元组列表作为第一个参数calcular_distancia
传递到d1
函数中。您可能希望data_temp
成为float
值的列表,但它实际上是(1)14元素元组的列表,如下所示:
>>> data_temp = [(atributos[0],atributos[1],atributos[2],atributos[3],atributos[4],atributos[5],atributos[6],atributos[7],atributos[8],atributos[9],atributos[10],atributos[11],atributos[12],atributos[13])]
>>> type(data_temp)
<type 'list'>
>>> type(data_temp[0])
<type 'tuple'>
>>> len(data_temp)
1
>>> len(data_temp[0])
14
我怀疑根本问题是,在定义[]
时,您使用方括号()
和括号data_temp
。如果您移除()
定义中的data_temp
,则应获得预期的结果。