2013-10-28 10 views
9

Quando metto a confronto due array NumPy dentro la mia funzione ottengo un errore che dice solo di lunghezza-1 array possono essere convertiti in scalari Python:Numba autojit errore sul confronto array NumPy

from numpy.random import rand 
from numba import autojit 

@autojit 
def myFun(): 
    a = rand(10,1) 
    b = rand(10,1) 
    idx = a > b 
    return idx 

myFun() 

L'errore:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-7-f7b68c0872a3> in <module>() 
----> 1 myFun() 

/Users/Guest/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/numba/numbawrapper.so in numba.numbawrapper._NumbaSpecializingWrapper.__call__ (numba/numbawrapper.c:3764)() 

TypeError: only length-1 arrays can be converted to Python scalars 

risposta

3

Questo potrebbe essere secondario al tuo problema, ma il modo in cui hai mostrato autojit non ti farà aumentare la velocità. Con numba è necessario mostrare esplicitamente le for loop in questo modo:

from numpy.random import rand 
from numba import autojit 
@autojit 
def myFun(): 
    a = rand(10,1) 
    b = rand(10,1) 
    idx = np.zeros((10,1),dtype=bool) 
    for x in range(10): 
     idx[x,0] = a[x,0] > b[x,0] 
    return idx 

myFun() 

Questo funziona bene.

+3

Bene, una delle principali motivazioni dell'utilizzo degli array NumPy è quella di sfruttare le funzioni incorporate e non dover riscrivere esplicitamente tutte le loro utilità. Ho appena fatto un semplice esempio in cui Numba si rompe con operazioni logiche su array NumPy. Ma, in generale, ottengo errori con molti tipi di indicizzazione booleana/logica, e questo è un metodo veramente utile se si sta facendo una codifica numerica/scientifica con gli array. – KartMan