【问题标题】:For-Loop over python float array在 python 浮点数组上的 For-Loop
【发布时间】:2020-07-06 12:12:57
【问题描述】:

我正在使用 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: 用作索引的数组必须是整数(或布尔值) 类型)

遍历这个数组的最佳解决方案是什么?

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

【问题讨论】:

    标签: python arrays for-loop


    【解决方案1】:

    据我所知,inner1test 是一个列表元组,因此 i 值不是索引而是实际列表。

    你应该使用枚举,它返回两个变量,索引和实际数据。

    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)
    

    另外,如果您的列表开始变大,请考虑使用生成器,该生成器将在每次迭代中执行您的计算迭代,并且一次只返回一个值,避免返回会占用大量内存的大量结果。

    例如:

    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 列表理解,它有时是处理带有列表的 for 循环的更优雅的方法。

    [编辑]

    无论如何,这可能是一个更简单的解决方案,不需要索引,它不会无法枚举一个 numpy 对象:

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

    [/编辑]

    【讨论】:

    • 不幸的是,即使我枚举它,它仍然显示相同的错误。 numpy.ndarray 中的 inner1test。我看到他们详细说明了该错误的帖子,我认为对于这种特定情况可能是正确的-但我不确定如何实现它。 stackoverflow.com/questions/17393989/…你认为这可能是解决方案吗?
    • 刚刚添加了一个不需要任何索引的简单示例
    • 谢谢。但是,编辑并没有真正迭代这两个数组。它必须迭代,因为输出应该是 2700 距离的完整数组。还是我弄错了,没有以正确的方式实施您的解决方案?
    • 嗯...你应该写一个for i in inner1test: print(i) 和相同的inner1train 以确保你的变量是可迭代的。如果没有,请发布结果。
    【解决方案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
    

    【讨论】:

    • 很高兴知道你整理好了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    相关资源
    最近更新 更多