列表理解在pythonshell中工作良好,但在运行脚本时会被忽略

列表理解在pythonshell中工作良好,但在运行脚本时会被忽略,python,arrays,list-comprehension,slice,Python,Arrays,List Comprehension,Slice,我有以下dnumpy数组: 数组([[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
numpy
数组:

数组([[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
数组

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

由于列表理解被忽略,因此永远不会计算
D
数组,并且函数将返回相同的
D
数组而不做任何更改

例如:

D[0,1:][D[0,i]+D[0,i-1]表示范围(1,m)内的i]
这应该用以下值填充
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的工具存在,但这是我自己的实现,适合特定的个人需求

我希望您能解释一下为什么忽略列表理解,我是否做了错事,这是否是一个bug,以及我如何克服它

我在Windows8上使用Python3.4x64和SpyderIDE2.3.5.2


TL;医生:

尝试使用列表理解而不是循环来计算多个列表,并将它们指定给二维数组的特定切片。它们在pythonshell中运行良好,但在脚本中运行时会被忽略。我不知道为什么


根据要求,MCVE:

将numpy导入为np
定义位置(x,y):
m=len(x)
n=len(y)
#欧几里德距离
d=np.数组([[(x[j]-y[i])**2表示范围(m)中的j]表示范围(n)],i表示范围(n)],
数据类型=浮点)
返回d
def距离(d):
n、 m=d形
D=np.零((n,m))
#第一个元素在两个矩阵中是相同的。
D[0,0]=D[0,0]
#第一行中的元素[0,1:]
D[0,1::=[D[0,j]+D[0,j-1]表示范围(1,m)内的j]
#第一列中的元素[1:,0]
D[1:,0]=[D[i,0]+D[i-1,0]代表范围(1,n)内的i]
#矩阵中的其余元素[1:,1:]
D[1:,1:][[D[i,j]+min(D[i-1,j-1],D[i-1,j],D[i,j-1])
对于范围(1,m)内的j)]
对于范围(1,n)内的i)]
返回D
# --
x=[0,1,2,3,2,1,0,1,2]
y=[0,1,1,2,2,3,1,0]
d=L距离(x,y)
D=距离(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://code>仅在计算整个列表表达式并将结果列表分配给
D[0:1://code>-so后计算,但对于已分配
D[0,0]
j==1
值,所有剩余值
D[0,j-1]


如果你碰巧在交互模式下使用过这个,那只能是因为你之前用有意义的值填充了D


在这种情况下,执行外部
for
循环将起作用,因为当您根据该循环计算值时,之前所需的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://code>仅在计算整个列表表达式并将结果列表分配给
D[0:1://code>-so后计算,但对于已分配
D[0,0]
j==1
值,所有剩余值
D[0,j-1]


如果你碰巧在交互模式下使用过这个,那只能是因为你之前用有意义的值填充了D


在这种情况下,执行外部
for
循环将起作用,因为当您根据该循环计算值时,之前所需的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://code>仅在计算整个列表表达式并将结果列表分配给
D[0:1://code>-so后计算,但对于已分配
D[0,0]
j==1
值,所有剩余值
D[0,j-1]

如果你,碰巧,曾经