2017-07-12 5 views
0

私は配列のリストを持っているので私のコードは動作していないと思う。配列のfinal_listのリストをマトリックスとして構造化することができ、numbaで受け入れられるようにするには、別の方法がありますか?numbaのリストに配列を追加するのと同等の処理を行うにはどうすればよいですか?

import numpy as np 
import matplotlib.pyplot as plt 
import numba as nb 
N_SPLITS = 1000 

@nb.jit(nopython=True) 
def logi(x0, r): 
    x = x0 
    for n in range(30000): 
    x = x * r * (1-x) 
    final_list = [x] 
    for n in range(N_SPLITS): 
    final_list.append(final_list[-1] * r * (1 - final_list[-1])) 
    return np.sort(final_list, axis=0) 

r = np.arange(2.4, 4., .001) 
for i in range(N_SPLITS): 
    plt.plot(r, logi(0.5, r)[i], c='k', lw=0.1) 
plt.savefig('bifig.pdf') 




    File "logi.py", line 18, in <module> 
    plt.plot(r, logi(0.5, r)[i], c='k', lw=0.1) 
    File "/usr/local/lib/python2.7/site-packages/numba/dispatcher.py", line 330, in _compile_for_args 
    raise e 
numba.errors.TypingError: Caused By: 
Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/site-packages/numba/compiler.py", line 235, in run 
    stage() 
    File "/usr/local/lib/python2.7/site-packages/numba/compiler.py", line 449, in stage_nopython_frontend 
    self.locals) 
    File "/usr/local/lib/python2.7/site-packages/numba/compiler.py", line 805, in type_inference_stage 
    infer.propagate() 
    File "/usr/local/lib/python2.7/site-packages/numba/typeinfer.py", line 767, in propagate 
    raise errors[0] 
TypingError: Invalid usage of BoundFunction(list.append for list(float64)) with parameters (array(float64, 1d, C)) 
* parameterized 
File "logi.py", line 13 
[1] During: resolving callee type: BoundFunction(list.append for list(float64)) 
[2] During: typing of call at logi.py (13) 

Failed at nopython (nopython frontend) 
Invalid usage of BoundFunction(list.append for list(float64)) with parameters (array(float64, 1d, C)) 
* parameterized 
File "logi.py", line 13 
[1] During: resolving callee type: BoundFunction(list.append for list(float64)) 
[2] During: typing of call at logi.py (13) 

答えて

2

あなたはnumbaのJITコンパイラのための問題を引き起こしていたあなたのコードで多くの問題があります。引数を指定して

  • np.sortは、(有効ではありませんも2D配列 でそれを使用していますnumpy supported featuresを参照)

  • xをfloatから配列に変更します。 Numba機能以下

を通して一貫型必要nopythonモードでコンパイルされ、同じ結果を生成numba関数です。基本的には、サイズはあらかじめ分かっているので、ストレージアレイをあらかじめ割り当てておいて、カラムごとにソートします。残念ながらnumbaは本当に良いソートの実装を持っていないので、あなたは本当に大きなスピードアップを得ることはありません。他のパフォーマンスチューニングの変更があるかもしれません。プロットセクションの各ループにlogiを呼び出して、単一の値を引き出すことは意味がないことにも注意してください。配列を一度計算してから、必要な値を選んでください。

%timeit logi_orig(0.5, r) 
%timeit logi(0.5, r) 
%timeit logi_nb(0.5, r) 

10 loops, best of 3: 171 ms per loop 
10 loops, best of 3: 168 ms per loop 
10 loops, best of 3: 77 ms per loop 
:Numbaのv0.34.0とOSX(2014 MBP)の

import numpy as np 
import matplotlib.pyplot as plt 
import numba as nb 
N_SPLITS = 1000 

%matplotlib inline 

def logi_orig(x0, r): 
    x = x0 
    for n in range(30000): 
     x = x * r * (1-x) 
    final_list = [x] 
    for n in range(N_SPLITS): 
     final_list.append(final_list[-1] * r * (1 - final_list[-1])) 
    return np.sort(final_list, axis=0) 

@nb.jit(nopython=True) 
def logi_nb(x0, r): 
    x = np.full_like(r, x0) 
    for n in range(30000): 
     x = x * r * (1-x) 
    final_list = np.empty((N_SPLITS + 1, r.shape[0]), dtype=np.float64) 
    final_list[0,:] = x 
    for n in range(1, N_SPLITS + 1): 
     final_list[n, :] = final_list[n - 1] * r * (1 - final_list[n - 1]) 

    out = np.empty_like(final_list) 
    for n in range(r.shape[0]): 
     out[:,n] = np.sort(final_list[:,n]) 

    return out 

def logi(x0, r): 
    x = np.full_like(r, x0) 
    for n in range(30000): 
     x = x * r * (1-x) 
    final_list = np.empty((N_SPLITS + 1, r.shape[0]), dtype=np.float64) 
    final_list[0,:] = x 
    for n in range(1, N_SPLITS + 1): 
     final_list[n, :] = final_list[n - 1] * r * (1 - final_list[n - 1]) 

    return np.sort(final_list, axis=0) 

r = np.arange(2.4, 4., .001) 

y_orig = logi_orig(0.5, r) 
y = logi(0.5, r) 
y_nb = logi_nb(0.5, r) 

print np.allclose(y, y_orig) 
print np.allclose(y_nb, y_orig) 

for i in range(N_SPLITS): 
    plt.plot(r, y[i], c='k', lw=0.1) 

とタイミング

関連する問題