循环嵌套问题 - 值不正确

Posted

技术标签:

【中文标题】循环嵌套问题 - 值不正确【英文标题】:Loop nesting issue - values not correct 【发布时间】:2017-11-01 08:48:24 【问题描述】:

我有一个数据框,它有两个相关的列(实际上有 >2,但不认为这很重要),其中一个列中有重复项。

重复项位于 HAB_slice['Radial Position'] 列中,增量为 0.1。

理想情况下,我想说如果 HAB_slice['Radial Position'] 中的两个值彼此相等,请找出它们之间的绝对值差并将它们添加到运行总计中。

当前代码如下所示:

    possible_pos = np.linspace(0, 1, 1 / stepsize+1) 
    center_sum = 0
    for i in range(0, len(possible_pos)): 
        temp = HAB_slice[HAB_slice['Radial Position']==possible_pos[i]]
        if len(temp) == 2:
            center_sum += np.abs(temp['I'].diff().values[1])
    print center_sum

虽然它确实返回一个值并且不会引发错误,但 center_sum 的值与我手动计算时的值不同。我认为这只是嵌套有问题,但我对循环很陌生并且不太确定。

错误示例:以下数据在此代码中产生 center_sum = 0,但如果您在径向位置彼此相等时手动计算 I 的绝对值差,则它等于 0.0045878。

I           Radial Position
0.14289522  1
0.14298554  0.9
0.1430356   0.8
0.1430454   0.7
0.1430552   0.6
0.14266456  0.5
0.14227392  0.4
0.14234106  0.3
0.14286598  0.2
0.1433909   0.1
0.14309062  0
0.14279034  0.1
0.14271344  0.2
0.14285992  0.3
0.1430064   0.4
0.14327248  0.5
0.14353856  0.6
0.14356664  0.7
0.14335672  0.8
0.1431468   0.9
0.14338368  1

编辑:我已经用示例代码简化了一些事情以尝试让它工作。

test1 = [[0.14309062,0],[0.1433909,0.1], [0.14286598,0.2], [0.14234106,0.3], 
[0.14279034,0.1], [0.14271344,0.2], [0.14285992,0.3]]
'''
test2 = [[0.14289522,1],[0.14298554,0.9],[0.1430356,0.8],[0.1430454,0.7],
[0.1430552,0.6],[0.14266456,0.5],[0.14227392,0.4],[0.14234106,0.3],
[0.14286598,0.2],[0.1433909,0.1],[0.14309062,0],[0.14279034,0.1],
[0.14271344,0.2],[0.14285992,0.3],[0.1430064,0.4],[0.14327248,0.5],
[0.14353856,0.6],[0.14356664,0.7],[0.14335672,0.8],[0.1431468,0.9],
[0.14338368,1]]
'''
stepsize = 0.1
possible_pos = np.linspace(0, 1, 1 / stepsize+1) 
HAB_slice = pd.DataFrame(test1)
HAB_slice.columns = ['I', 'Radial Position']

【问题讨论】:

闻起来像浮动 pt 问题。 【参考方案1】:

试试下面的代码。它应该可以工作。

possible_pos = np.linspace(0, 1, 1 / stepsize+1) 
center_sum = 0

for i in range(0, len(possible_pos)):

    # retriving index position of the step value 
    indices = [i for i, x in enumerate(HAB_slice['Radial Position']) if x == possible_pos[i]]

    # if multiple value exist for the postion
    if len(indices) > 1:
        values = [x for i, x in enumerate(HAB_slice['I']) if i in indices]
        center_sum += np.abs(np.diff(values))

    # if single value exist for the position
    elif len(indices) == 1:
        center_sum += HAB_slice['I'][indices[0]]

    # if no value exist for the position
    else: continue  

print center_sum

【讨论】:

感谢您的帮助!当我使用该代码时,我得到一个索引错误:索引 11 超出了定义索引的行中大小为 11 的轴 0 的范围。由于我不知道 i for i 在做什么,我什至不知道从哪里开始找到它所抱怨的问题。 使用缩短的测试用例 [[0.14309062,0],[0.1433909,0.1], [0.14286598,0.2], [0.14234106,0.3], [0.14279034,0.1], [0.14271344,0.2] , [0.14285992,0.3]],它不会出错,但它还为 center_sum 提供两个值而不是一个,并且它们都不对应于手动计算的值 0.00127196 “i for i, x”中的 i 是当前步长值的索引位置(计数器)。 enumerate() 函数将一个计数器作为 (counter, element) 添加到列表中。 你如何表示数据?在您的问题中,您已将其发布为两个不同的列表,但在评论中您将其表示为单个列表,其中数据耦合在一起。数据的迭代将根据您的数据表示而改变。 我在上面添加了一个更新,向您展示我一直在尝试测试的内容。 test1 是一个很小的子集,它不会抛出错误,但值也不正确(test1 的 center_sum 应该等于 0.00127196),实际上有两个值。

以上是关于循环嵌套问题 - 值不正确的主要内容,如果未能解决你的问题,请参考以下文章

如何在带有嵌套字典的嵌套循环中正确使用字典“.update”函数[重复]

嵌套循环中未正确忽略内部循环的 Pragma omp parallel

递增循环是 R 中三重嵌套循环的正确方式

OpenMP 嵌套循环任务并行性,计数器未给出正确结果

无法从嵌套for循环访问父for循环

避免在循环中使用嵌套的可观察订阅的正确方法是啥?