为什么此Python函数会中断循环?

时间:2019-06-17 22:03:49

标签: python pandas for-loop

这个问题

Finding the best trade-off point on a curve

我正在使用Python解决方案,如果我自己运行它,它会很好用。

但是我有这些“曲线”的字典:

sse {}

{'00': [4.998436383771836,
  0.0160165895672664,
  0.004512422186993107,
  0.0013171501024742112,
  0.000788783358847752,
  0.0005498425886621068],
'67':[0.13598930783101504,
  0.04717783658889547,
  0.027547125931827038,
  0.021440839841617088,
  0.016775671441391703,
  0.013185864754748117,
  0.010318462898609907],

以此类推...

如果我运行它,它将运行完美:

curve = sse['67']
nPoints = len(curve)
allCoord = np.vstack((range(nPoints), curve)).T
np.array([range(nPoints), curve])
firstPoint = allCoord[0]
lineVec = allCoord[-1] - allCoord[0]
lineVecNorm = lineVec / np.sqrt(np.sum(lineVec**2))
vecFromFirst = allCoord - firstPoint
scalarProduct = np.sum(vecFromFirst * np.matlib.repmat(lineVecNorm, nPoints, 1), axis=1)
vecFromFirstParallel = np.outer(scalarProduct, lineVecNorm)
vecToLine = vecFromFirst - vecFromFirstParallel
distToLine = np.sqrt(np.sum(vecToLine ** 2, axis=1))
idxOfBestPoint = np.argmax(distToLine)

print(idxOfBestPoint)

但是当我尝试使其成为循环函数时,我得到的奇怪值与单独运行时不匹配:

for k in sse:
    curve = sse[str(k)]
    nPoints = len(curve)
    allCoord = np.vstack((range(nPoints), curve)).T
    np.array([range(nPoints), curve])
    firstPoint = allCoord[0]
    lineVeceVeceVec = allCoord[-1] - allCoord[0]
    lineVecNorm = lineVec / np.sqrt(np.sum(lineVec**2))
    vecFromFirst = allCoord - firstPoint
    scalarProduct = np.sum(vecFromFirst * np.matlib.repmat(lineVecNorm, nPoints, 1), axis=1)
    vecFromFirstParallel = np.outer(scalarProduct, lineVecNorm)
    vecToLine = vecFromFirst - vecFromFirstParallel
    distToLine = np.sqrt(np.sum(vecToLine ** 2, axis=1))
    idxOfBestPoint = np.argmax(distToLine)
    print(idxOfBestPoint, k)

它会吐出这样的东西:

7 57
98 11
6 45
4 50
98 91
98 00
1 62
98 79
7 48
98 12
98 38
98 23
5 37
98 56
98 67
5 25
7 46
98 22
98 49
2 47
98 41
98 78
98 35
98 68
98 14
98 24
1 0
98 42

我无法确定是否存在一些无法重置的变量,或者是什么原因会导致它通过添加简单的循环而失败?

为清楚起见,它确实可以运行,但是calc将“ 98”作为弯头放到循环中,但是当单独运行时,“ 67”曲线列表将为7,而不是98。

1 个答案:

答案 0 :(得分:0)

您有错字:lineVeceVeceVec = allCoord[-1] - allCoord[0]。它应该是lineVec = allCoord[-1] - allCoord[0]。因此,您吐出的是最后一次将lineVec分配给结果的时间,而最后一个值可能是您运行非循环版本的时间。