我有以下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
数组,每个值都正确, 除外第一行的em> ,它不会改变任何东西,而不是将上面的列表分配给数组切片,它只是从{{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
答案 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项的先前所需值。