2017-10-07 88 views
0

錯誤。如果我用這個功能Numba nopython與np.sum

import numpy as np 
from numba import jit 

@jit(nopython=True) 
def diss_matrix(data): 
    n = data.shape[0] 
    diss = np.empty((n, n)) 
    for i in range(n): 
     for j in range(i): 
      dist = np.absolute(data[i] - data[j]).sum() 
      diss[i, j] = dist 
      diss[j, i] = dist 
    return diss 

x = np.random.randn(100) 
print(diss_matrix(x)) 

我得到這個錯誤

numba.errors.UntypedAttributeError: Failed at nopython (nopython frontend) 
Unknown attribute 'sum' of type float64 
File "test_numba.py", line 11 
[1] During: typing of get attribute at 
c:/Users/matte/Dropbox/Università/SDS/Thesis/source/test_numba.py (11) 

我一直在試圖理解這意味着什麼。事實是,觸發錯誤的指令是以下

dist = np.absolute(data[i] - data[j]).sum() 

,但我認爲問題是,不知何故,numba假定data[i]data[j]float64,而不是陣列。 其實,下面的代碼

@jit(nopython=True) 
def diss_matrix3(): 
    vec1 = np.array([1, 2, 3]) 
    vec2 = np.array([2, 3, 4]) 
    dist = np.absolute(vec1 - vec2).sum() 
    return dist 

完美無缺的作品。

我正在使用numba 0.35,我試圖找到一種方法來使該功能起作用。我知道scipy.spatial.distance.pdist的存在,但我需要自己實現。此外,未來可能會出現同樣的錯誤。

有什麼建議嗎?

回答

4

如果你看np.random.randn(100)的形狀它是(100,),所以data[i]確實是一個標量,而不是一個數組。如果你使用np.random.randn(100,100)它應該工作。請查看docs for randn以獲取有關該功能如何工作的更詳細說明。

+0

謝謝!我很絕望,沒有檢查這種基本的東西。誤導我的是它使用'nopython = False'編譯的事實。 –