2017-10-11 16 views
2

ジェネリックメトリックの相違行列を構築する必要があります。アルゴリズムを速く実行する必要があるので、私は 0.35をnopythonモードで使用しました。 ここに私のコードNumba jit nopythonモード:外部任意関数の署名をnumbaに伝える

import numpy as np 
from numba import jit 
from jellyfish import levenshtein_distance 

def _dissimilarity_matrix(metric): 
    @jit(nopython=True) 
    def dm(data): 
     n = data.shape[0] 
     diss = np.zeros((n, n)) 
     for i in range(n): 
      for j in range(i+1): 
       dist = metric(data[i], data[j]) 
       diss[i, j] = dist 
       diss[j, i] = dist 
     return diss 

    return dm 

@jit(nopython=True) 
def euclidean_distance(vec1, vec2): 
    return np.sqrt(((vec1 - vec2)**2).sum()) 

test1 = np.random.randn(10, 2) 
dissimilarity_matrix1 = _dissimilarity_matrix(euclidean_distance) 
diss1 = dissimilarity_matrix1(test1) 

test2 = np.array(["this", "is", "a", "test"]) 
dissimilarity_matrix2 = _dissimilarity_matrix(levenshtein_distance) 
diss2 = dissimilarity_matrix2(test2) 

ですが、出力は次のとおりです。機能levenshtein_distanceは、外部モジュール(ないから来ている間、機能euclidean_distanceは私によって定義され

numba.errors.TypingError: Failed at nopython (nopython frontend) 
Untyped global name 'metric': cannot determine Numba type of <class 'builtin_function_or_method'> 
File "test.py", line 12 

注こととデコレータ@jit(nopython=True)を持っています私によって書かれた)。 numbaに渡された関数の署名を明示的に伝える方法はありますか(すなわちmetric_dissimilarity_matrix)? 私は本当に_dissimilarity_matrixモードで実行し、入力として任意の関数を受け入れることが必要です。nopython

+0

nopythonモードで任意のPython関数を呼び出すことはできません。これはnopythonモードの核となる機能です。Pythonはありません。 – user2357112

+0

私は自分ですべての関数を定義して、それらを 'nopython'モードで動かすことはできませんが、方法はありませんか? –

答えて

1

metriceuclidean_distanceの場合、コードは私のために働きます。これは、nopythonのnumba関数でもあるためです。しかし、任意の関数を渡すことはできません。 nopythonモードで何かを動作させるには、呼び出し可能なすべての関数をnumba(http://numba.pydata.org/numba-doc/latest/reference/pysupported.htmlおよびhttp://numba.pydata.org/numba-doc/latest/reference/numpysupported.html参照)でサポートするか、numba nopython関数としてユーザ定義する必要があります。その制約を回避することはできません。

+0

ありがとうございます。 'jit(levenshtein_distance)'や 'njit(levenshtein_distance)'のようなものでさえそうはしませんよね? '@jit(nopython = True)'で装飾された独自の関数を書く必要があります。 –

+1

'levenshtein_distance'がnumbaがjitできるように書かれていればうまくいくが、そうするために提供したリンクのサポートされている機能を遵守しなければならないだろう。 – JoshAdel

関連する問題