簡體   English   中英

使用Numba的@jit與Python中使用的Numpy的float32導致數學不一致

[英]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.meanpandas.mean (使用bottleneck )之間的numpy.mean給出了答案 因此,這里所說的所有內容在這里也適用,請簡要查看一下以獲取更多詳細信息:

  • numba所使用的朴素求和具有O(n)的誤差,其中n是求和數。
  • Numpy使用類似於成對求和的方法 ,該方法更精確,且誤差為O(log(n))
  • 對於float32 ,差異是顯而易見的,但對於float64 ,差異並不明顯,盡管仍然存在相同的問題。

暫無
暫無

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

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