2014-02-28 61 views
2

我使用numpy來總結一個數組,並且它不適用於float32類型。我究竟做錯了什麼?一旦我直接完成一筆款項,然後使用numpy.sum。看下面的代碼numpy sum沒有給出float32類型的正確答案

import struct 
import numpy as np 
import matplotlib.pyplot as plt 
import math 
from pylab import * 
xpt=128 
ypt=128 
zpt=256 
bx1=np.zeros((xpt,ypt,zpt),dtype=float32) 
bx2=np.zeros((xpt,ypt,zpt),dtype=float32) 
bx3=np.zeros((xpt,ypt,zpt),dtype=float32) 

bx1=bx1+1.0 
bx2=bx2+1.5 
bx3=bx3+2.0 

dummy=0.0 
for kxi in range (0,xpt) : 
    for kyi in range (0,ypt) : 
    for kzi in range (0,zpt) : 
     dummy=dummy+(bx1[kxi,kyi,kzi]*bx1[kxi,kyi,kzi]+bx2[kxi,kyi,kzi]*bx2[kxi,kyi,kzi]+bx3[kxi,kyi,kzi]*bx3[kxi,kyi,kzi]) 
print(dummy) 

print(np.sum(bx1**2+bx2**2+bx3**2)) 

兩個輸出應該匹配。這使輸出:
30408704.0
3.1323e + 07

直和給出正確的結果,而np.sum是給了什麼。但是,如果我使用float64,那麼np.sum會給出正確的結果。這背後的原因是什麼?

謝謝。

回答

4

這是一個數字很大的float32的準確性的問題。我沒有經歷過怎樣運行2.25將被存儲,但小例子

x = 2.25 * np.ones((128, 128, 256), dtype = float32) 
y = 2.25 * np.ones((128, 128, 256), dtype = float64) 
x.sum() # 8854642.0 
y.sum() # 9437184.0 
2.25 * 128 * 128 * 256 # 9437184.0 

可見,你失去的準確性,但float64(Python的standard float)獲得了回去。

1

加入大量小數字時可能導致舍入誤差\精度損失。

如果你先總結一個軸,然後求和那個結果。你得到了正確的答案。

print(np.sum(bx1**2+bx2**2+bx3**2, axis=0).sum()) 

浮點的是一個狡猾的生物,永遠不會相信他們。