我有一个浮动列表的列表,像这样:
u = [[1.2, 1.534, 23.5, ...], [0.2, 11.5, 3.3223, ...], ...]
使用Python计算新列表(高度和宽度是列表尺寸,u2是设置为0.0的浮点列表的列表):
for time in xrange(start, stop):
for i in xrange(1,height-1):
for j in xrange(1, width-1):
u2[i][j] = u[i][j-1] + u[i-1][j] - time * (u[i][j+1] / u[i+1][j])
u = deepcopy(u2)
正如预期的那样,这将产生一个新的浮点列表列表。
但是,通过以下简单的方法将其转移到Numpy:
un = array(u)
然后使用相同的循环(这次u2是零数组):
for time in xrange(start, stop):
for i in xrange(1,height-1):
for j in xrange(1, width-1):
u2[i][j] = un[i][j-1] + un[i-1][j] - time * (un[i][j+1] / un[i+1][j])
un = u2
只要高度,宽度和时间范围都很小,...就会产生与Python实现相同的结果,但是随着这些变量的设置越来越高,结果会有所不同。
有没有办法防止这种浮点误差的积累?
(这不是真正的代码,只是我想弄清楚如何在Python和Numpy中处理数字,因此有关向量化或其他Numpy效率方面的任何建议都是不合时宜的)
最佳答案
乍看起来,问题似乎是un = u2
。这将创建对u2
的引用,而不是副本,因此您可以直接在内部循环中修改u
。这将给您与纯Python版本不同的结果,因为u2[i][j]
的值取决于u[i][j-1]
和u[i-1][j]
。
尝试使用un = u2.copy()
强制进行复制。