2017-05-16 1 views
1

ループのパフォーマンスを向上させるために、Numbaベクトル化メソッドを使用しました。2つの変数を返すためにNumbaを宣言する

s1 = pd.Series([1,3,5,6,8,10,1,1,1,1,1,1]) 
s2 = pd.Series([4,5,6,8,10,1,7,1,6,5,4,3]) 

ding=pd.DataFrame({'A':s1,'B':s2}) 

@numba.vectorize(['float64(int16,int16)']) 
def sumd(a,b):  
    if a==1: 
     return (a+b) 
    else: 
     return 0 

ding['sum']=sumd(ding.A,ding.B) 

ここで、列AとBの積である追加変数を返したいと思います。つまり、vectorizeメソッドを使用して関数から2つの変数を返すことです。 numba.vectorizeメソッドを初期化する方法がわかりません。私を助けてください。私は、方法の効率を改善するための他の方法も聞くことができます。

私が試した1つの代替アプローチは次のとおりですが、これは私にとっては少し難解でした。私は機能を最適化する簡単な方法を探しています。前もって感謝します。

s1 = pd.Series([1,3,5,6,8,10,1,1,1,1,1,1]) 
s2 = pd.Series([4,5,6,8,10,1,7,1,6,5,4,3]) 

ding=pd.DataFrame({'A':s1,'B':s2}) 

@numba.vectorize(['float64(int16,int16)']) 
def sumd(a,b):  
    if a==1: 
     sumarr.append((a+b)) 
     prodarr.append(a*b) 
     return 1 
    else: 
     sumarr.append(0) 
     prodarr.append(0) 
     return 1 

sumarr=[] 
prodarr=[] 
sumd(ding.A,ding.B) 
ding['sum']=sumarr 
ding['prod']=prodarr 

答えて

2

vectorizeから複数の値を返すことはできません。グローバルリストを使用することはできません。私はだけではなく、標準のJIT機能を使用します。

@nb.jit(nopython=True) 
def sumd(a, b): 
    sumx = np.zeros_like(a, dtype=np.float64) 
    prodx = np.zeros_like(a, dtype=np.float64) 

    for i in range(a.shape[0]): 
     if a[i] == 1: 
      sumx[i] = a[i] + b[i] 
      prodx[i] = a[i] * b[i] 

    return sumx, prodx 

sumx, prodx = sumd(ding.A.values, ding.B.values) 
ding['sum'] = sumx 
ding['prod'] = prodx 

注意これは常に、より効率的であるので、私はnopythonモードでnumbaを使用できるように、私は、各列のvaluesに渡しています。

関連する問題