Numpy与Python浮点计算产生不同的结果

时间:2015-10-26 09:07:28

标签: python numpy floating-point

我有一个浮动列表列表,如下所示:

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实现相同的结果,只要 height width 和时间范围都很小,但结果不同,因为这些变量设置得更高,更高。

  • 有没有办法防止这种浮动不准确的累积?

(这不是真正的代码,只是我在弄乱如何理解数字在Python和Numpy中的处理方式,所以关于矢量化或其他Numpy效率的东西的任何建议都是偏离主题的)

1 个答案:

答案 0 :(得分:2)

乍一看问题似乎是un = u2。这会创建对u2的引用而不是副本,因此您将直接修改内部循环中的u。这将为您提供与纯Python版本不同的结果,因为u2[i][j]的值取决于u[i][j-1]u[i-1][j]

请尝试un = u2.copy()强制复制。