【发布时间】:2015-10-26 17:44:47
【问题描述】:
我有一个浮动列表,如下所示:
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
... 只要 height、width 和时间范围都很小,就会产生与 Python 实现相同的结果,但是随着这些变量设置得更高和更高。
- 有没有办法防止这种浮动误差的累积?
(这不是真正的代码,只是为了了解 Python 和 Numpy 中如何处理数字,所以关于向量化或其他 Numpy 效率的任何建议都是题外话)
【问题讨论】:
-
谢谢。但是 Numpy 中的浮点数和纯 Python 中的浮点数之间的差异是否等于其他平台上的浮点数的差异?避免纯 Python 计算结果与 Numpy 计算结果之间不准确的最佳做法是什么?
-
你能指定python/numpy版本和u2.dtype吗?
-
2.7.10 和 numpy 1.10.1。 u2.dtype 是 float64。
-
@MathiasEttinger 我不相信这是重复的 - 这个问题是关于在不同机器上运行的相同代码之间的浮点结果差异,而 OP 询问的是两个特定的 Python 和 numpy正在(大概?)在同一台机器上执行的实现。
标签: python numpy floating-point