1

我正在制作一个小程序,在某个时候,我需要从矩阵的每一行中减去行本身的平均值。相当标准的重整化过程。

代码中的注意事项

def subtractaverage(data):
    datanormalized=[]
    for row in data:
        average_row=sum(row)/len(row)
        print "average=",average_row
#       renormalized_row=[cell-average_row for cell in row]
        renormalized_row=[-average_row+cell for cell in row]        
        datanormalized.append(renormalized_row) 
    matrixnormalized=np.array(datanormalized)
    return matrixnormalized

行: # renormalized_row=[cell-average_row for cell in row] renormalized_row=[-average_row+cell for cell in row]

我首先尝试了第一行(cell-average_row),但它不起作用。结果是 renormalized_row 最终等于 row。

然后第二行反而起作用了。所以不知何故,编译器似乎将 [cell-average_row for cell in row] 解释为 [cell for cell in row]。

但如果我写:

renormalized_row=[cell-100 for cell in row] 

它工作正常(并产生一个从每个单元格中减去值 100 的新列表。我尝试了另一个小程序,然后:

rs=range(10)
val=5
t=[r-val for r in rs]
print t,rs

这也有效并产生

[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

正如它应该。

所以现在我很茫然。是的,我可以使用 renormalized_row=[-average_row+cell for cell in row] 但我想了解发生了什么。为什么在解释表达式的方式上有这种明显的不一致。

我在 OSX 10.6.4 上使用 python2.6.5(2.6.6 没有 Mac 的 .dmg)

谢谢

当天晚些时候在另一组数据上尝试了该程序,它确实有效。在原始数据上再次测试它再次起作用。我更加困惑。但我知道我什至错过了宣战理由来表明某些事情没有按应有的方式发挥作用。

我们可以请关闭这个问题

4

1 回答 1

2

我想问题是整数除法(如果row仅由整数组成)

average_row=sum(row)/len(row)

如果行的长度大于总和,这将为您提供平均值 0。尝试

average_row=sum(row)/float(len(row))

反而。

于 2010-09-09T09:35:48.597 回答