[英]Using Numba's @jit causing math inconsistencies with Numpy's float32 being used in Python
當將Numba的@jit
與Numpy的float32
數據類型一起使用時,我會截斷嗎? 問題。 這很大程度上是噪音,因為它已經遠遠超過了我所關心的小數點(大約在第7位或第8位),但是知道發生了什么以及是否可以解決它仍然很好。
float32
我必須使用float32
數據類型來節省內存!
這是我用作測試的代碼:
import numpy as np
from test_numba import test_numba
np.random.seed(seed=1774);
number = 150;
inArray = np.round(np.float32((np.random.rand(number)-.5)*2),4); #set up a float32 with 4 decimal places
numbaGet = test_numba(inArray); #run it through
print("Get:\t"+str(numbaGet)+" Type: "+str(type(numbaGet)));
print("Want:\t"+str(np.mean(inArray))+" Type: "+str(type(np.mean(inArray)))); #compare to expected
結合以下功能
import numpy as np
from numba import jit #, float32
@jit(nopython=True) #nopython=True, nogil=True, parallel=True, cache=True , nogil=True, parallel=True #float32(float32),
def test_numba(inArray):
#outArray = np.float32(np.mean(inArray)); #forcing float32 did not change it
outArray = np.mean(inArray);
return outArray;
輸出是:
Get: 0.0982406809926033 Type: <class 'float'>
Want: 0.09824067 Type: <class 'numpy.float32'>
這似乎表明Numba正在使它成為Python的float
類(據我所知,它是float64
)並進行數學運算,然后以某種方式失去精度。
如果我切換到float64
則差異將大大減小。
Get: 0.09824066666666667 Type: <class 'float'>
Want: 0.09824066666666668 Type: <class 'numpy.float64'>
不知道我在做什么錯。 同樣,對於我來說,這是一個可忽略的問題(從小數點后4位開始),但仍然想知道為什么!
原因是,numba不使用np.mean
而是將其替換為/推出自己的版本 :
def array_mean_impl(arr):
# Can't use the naive `arr.sum() / arr.size`, as it would return
# a wrong result on integer sum overflow.
c = zero
for v in np.nditer(arr):
c += v.item()
return c / arr.size
前段時間,我對一個非常類似的問題 numpy.mean
和pandas.mean
(使用bottleneck
)之間的numpy.mean
給出了答案 。 因此,這里所說的所有內容在這里也適用,請簡要查看一下以獲取更多詳細信息:
numba
所使用的朴素求和具有O(n)
的誤差,其中n
是求和數。 O(log(n))
。 float32
,差異是顯而易見的,但對於float64
,差異並不明顯,盡管仍然存在相同的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.