列表推导在Python shell中工作正常,但在运行脚本时会被忽略

时间:2015-10-14 21:53:16

标签: python arrays list-comprehension slice

我有以下d numpy数组:

array([[0, 1, 4, 9, 4, 1, 0, 1, 4],
       [1, 0, 1, 4, 1, 0, 1, 0, 1],
       [1, 0, 1, 4, 1, 0, 1, 0, 1],
       [4, 1, 0, 1, 0, 1, 4, 1, 0],
       [4, 1, 0, 1, 0, 1, 4, 1, 0],
       [9, 4, 1, 0, 1, 4, 9, 4, 1],
       [1, 0, 1, 4, 1, 0, 1, 0, 1],
       [0, 1, 4, 9, 4, 1, 0, 1, 4]])

我需要使用动态时间扭曲算法填充另一个2d数组(D),这需要先填充第一行和第一列,然后填充数组的其余部分。

为此,我有一个DTWdistance(d)函数,它接收上面的d数组作为参数来计算并返回新的D数组。

我打算在for循环上使用列表推导,但是当循环按预期工作时,在运行脚本时完全忽略列表推导。但是,它们在Python shell中运行时工作正常,因此可以丢弃任何语法错误。

由于忽略了列表推导,因此永远不会计算D数组,并且该函数返回相同的d数组而不做任何更改。

例如:

D[0,1:] = [d[0,i] + D[0, i-1] for i in range(1, m)]

这应该填充D数组的第一行(从i=1开始),其中包含以下值:[1, 5, 14, 18, 19, 19, 20, 24]

但是,对于第一行和for循环的列表理解,它会产生D数组,每个值都正确, 除外 ,它不会改变任何东西,而不是将上面的列表分配给数组切片,它只是从{{1}的相应切片中确定这些值。 } array:d

因此,通过使用列表推导来计算整个[1, 4, 9, 4, 1, 0, 1, 4]数组,我只得到相同的D数组。

我很清楚那里有几个面向DTW的工具,但这是我自己的实现,适合一系列特定的个人需求。

我希望解释为什么列表理解被忽略,如果我可能做错了或者这可能是一个错误,以及我如何克服它。

我在Windows 8上使用Python 3.4 x64和Spyder IDE 2.3.5.2。

TL; DR:

尝试使用列表推导而不是循环来计算多个列表并将它们分配给2d数组的特定切片。它们在Python shell中运行良好,但如果在脚本中运行则会被忽略。我不明白为什么。

根据要求,MCVE:

d

1 个答案:

答案 0 :(得分:3)

这里错误的部分是,你不能做这样的事情:

D[0, 1:] = [d[0, j] + D[0, j-1] for j in range(1, m)]

正如您所看到的,您正在尝试在D上使用一个元素,这将被计算出来 在这个内部循环内部(D[0, j-1]部分)。 D[0, 1:]仅在评估整个列表表达式并将结果列表分配给D[0: 1:]后计算 - 因此,但对于您已分配j == 1的{​​{1}}值,所有剩余值D[0, 0]均为0.

如果你偶然让他在交互模式下工作,那可能只是因为你之前用D填充了有意义的值。

在这种情况下,执行外部D[0, j-1]循环将起作用,因为在根据该值计算值时,已经分配了D项的先前所需值。