簡體   English   中英

Numpy vs Python浮點計算產生不同的結果

[英]Numpy vs Python floating point calculations produce different results

我有一個浮動列表的列表,像這樣:

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()強制復制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM