2015-05-05 40 views
3

爲什麼Numba的jit不能編譯一個簡單的Numpy數組操作?使用numba工作和操作numpy數組

下面是一個最小的非工作的例子,再現Numba未能編譯

import numpy as np 
from numba import jit 

rows = 10 
columns = 999999 
A = np.empty((rows, columns)) 
b = np.linspace(0, 1, num=rows) 

@jit(nopython=True) 
def replicate(A, b): 
    for i in range(A.shape[1]): 
     A[:, i] = b 
    return A #optional 

replicate(a, b) 

,出現以下錯誤:

TypingError: Failed at nopython (nopython frontend) 
Cannot resolve setitem: array(float64, 1d, C, nonconst)[(slice3_type, int64)] = array(float64, 1d, C, nonconst) 
File "<ipython-input-32-db24fbe2922f>", line 12 

難道我做錯了什麼?另外,我需要nopython模式,因爲在我的真實情況下,我需要執行數組加法,乘以標量和頻繁使用其他數組的數組。我的理解是,在對象模式下,我將無法進行循環連接,因此在執行過程中我不會看到任何真正的性能提升。

回答

3

Numba不支持nopython模式下的numpy切片。嘗試顯式地展開循環:

rows = 10 
columns = 999999 
a = np.empty((rows, columns)) 
b = np.linspace(0, 1, num=rows) 

@jit(nopython=True) 
def replicate(A, b): 
    for i in xrange(A.shape[0]): 
     for j in xrange(A.shape[1]): 
      A[i, j] = b[i] 
    return A #optional 

replicate(a, b)