我有以下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]])
我需要D
使用动态时间规整算法填充另一个2d数组(),该算法需要先填充第一行和第一列,然后再填充数组的其余部分。
为此,我有一个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
具有正确值的数组,除了第一行不会改变任何内容,而不是将上面的列表分配给该数组切片,它只是从d
数组的相应切片中分配那些值:[1, 4, 9, 4, 1, 0, 1, 4]
。
结果,通过使用列表推导来计算整个D
数组,我得到的只是同一个d
数组。
我很清楚那里存在几种面向DTW的工具,但这是我自己的实现,可以满足一组特定的个人需求。
我将对以下原因进行解释,这些解释为何会忽略列表推导,如果我做错了什么,或者这可能是个错误,以及如何克服它。
我在Windows 8上使用Python 3.4 x64和Spyder IDE 2.3.5.2。
TL; DR:
尝试使用列表推导而不是循环来计算多个列表,并将其分配给2d数组的特定切片。它们在Python Shell中可以正常工作,但是如果在脚本中运行则将被忽略。我不知道为什么。
根据要求,MCVE:
import numpy as np
def ldistance(x, y):
m = len(x)
n = len(y)
# Euclidean distance
d = np.array([[(x[j]-y[i])**2 for j in range(m)] for i in range(n)],
dtype=float)
return d
def cdistance(d):
n, m = d.shape
D = np.zeros((n, m))
# First element is identical in both matrices.
D[0, 0] = d[0, 0]
# Elements in first row [0, 1:]
D[0, 1:] = [d[0, j] + D[0, j-1] for j in range(1, m)]
# Elements in first column [1:, 0]
D[1:, 0] = [d[i, 0] + D[i-1, 0] for i in range(1, n)]
# Rest of the elements in the matrix [1:, 1:]
D[1:, 1:] = [[d[i, j] + min(D[i-1, j-1], D[i-1, j], D[i, j-1])
for j in range(1, m)]
for i in range(1, n)]
return D
# --
x = [0, 1, 2, 3, 2, 1, 0, 1, 2]
y = [0, 1, 1, 2, 2, 3, 1, 0]
d = ldistance(x, y)
D = cdistance(d)
这里的错误部分是您无法做这种事情:
D[0, 1:] = [d[0, j] + D[0, j-1] for j in range(1, m)]
如您所见,您正在尝试在D上使用元素,该元素将在此内部循环本身(D[0, j-1]
部分)中计算。D[0, 1:]
仅在对整个列表表达式求值并将结果列表分配给-so之后才计算D[0: 1:]
,但是对于j == 1
您已分配的位置的值D[0, 0]
,所有其余值D[0, j-1]
均为0。
如果您偶然地在交互模式下进行了此操作,那可能仅是因为您之前用有意义的值填充了D。
for
在这种情况下,可以执行外部循环,因为在根据该值计算值时,已经分配了D项目的先前所需值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句