gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:24:11 25 4
gpt4 key购买 nike

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

u = [[1.2, 1.534, 23.5, ...], [0.2, 11.5, 3.3223, ...], ...]

使用Python计算一个新列表(高度和宽度是列表尺寸,u2是设置为0.0的 float 列表的列表):

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)

正如预期的那样,这会生成一个新的 float 列表。

但是,通过简单的操作将其传输到 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

... 只要 heightwidth 和时间范围都很小,就会产生与 Python 实现相同的结果,但当这些变量设置得更高并且时间范围更大时,结果会不同更高。

  • 有没有办法防止这种 float 误差的累积?

(这不是真正的代码,只是我在闲逛以了解 Python 和 Numpy 中如何处理数字,因此任何有关矢量化或其他 Numpy 效率内容的建议都是题外话)

最佳答案

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

尝试使用 un = u2.copy() 来强制复制。

关于python - Numpy 与 Python 浮点计算产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33341972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com