python浮点数组上的ForLoop

2024-04-26 18:20:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用IRIS数据集。我有两组数据,(1个训练集)(2个测试集)。现在我想计算每个测试集行和列车集行之间的欧几里德距离。但是,我只想包括该行的前4个点

一个有效的例子是:

dist = np.linalg.norm(inner1test[0][0:4]-inner1train[0][0:4])
print(dist)
***output: 3.034243***

问题是我有120个训练集点和30个测试集点——因此我必须手动执行2700个操作,因此我考虑使用for循环进行迭代。不幸的是,我的每一次尝试都失败了

这将是我最好的尝试,它会显示错误消息

for i in inner1test:
    for number in inner1train: 
        dist = np.linalg.norm(inner1test[i][0:4]-inner1train[number][0:4])
        print(dist)

(IndexError: arrays used as indices must be of integer (or boolean) type)

迭代此数组的最佳解决方案是什么

ps:我还将提供一个屏幕截图,以便更好地可视化

visualization


Tags: 数据in距离normnumberirisfordist
2条回答

这是最终的解决方案,为我提供了正确的输出:

distanceslist = list()

for testvalue in inner1test:
    for testtrain in inner1train:
        dist = np.linalg.norm(testvalue[0:4]-testtrain[0:4])
        distances = (dist, testtrain[0:4])
        distanceslist.append(distances)
        
distanceslist

从我所看到的,inner1test是列表的元组,因此i值将不是索引,而是实际的列表

您应该使用enumerate,它返回两个变量,索引和实际数据

for i, value in enumerate(inner1test):
    for j, number in enumerate(inner1train): 
        dist = np.linalg.norm(inner1test[i][0:4]-inner1train[number][0:4])
        print(dist)

此外,如果你的列表开始变大,考虑使用一个生成器,它将每次迭代执行你的计算迭代,每次只返回一个值,避免返回一大块会占用大量内存的结果。p>

例如:

def my_calculatiuon(inner1test, inner1train):
    for i, value in enumerate(inner1test):
        for j, number in enumerate(inner1train): 
            dist = np.linalg.norm(inner1test[i][0:4]-inner1train[number][0:4])
            yield dist

for i in my_calculatiuon(inner1test, inner1train):
   print(i)
       

您可能还想研究python列表理解,这有时是处理带有列表的循环的更优雅的方式

[编辑]

不管怎么说,这里有一个可能更简单的解决方案,不需要索引,它不会不枚举numpy对象:

for testvalue in inner1test:
    for testtrain in inner1train:
        dist = np.linalg.norm(testvalue[0:4]-testtrain[0:4])

[/编辑]

相关问题 更多 >