2014-10-11 13 views
9

Sto riscontrando alcuni problemi con la funzione numpy.vectorize.numpy.vectorize restituisce valori errati

Ho definito una funzione che funziona bene per l'input di un singolo elemento ma la versione vettoriale restituisce risultati diversi. Che cosa sto facendo male?

Codice:

def c_inf_comp(z): 
    if z>0: 
     return np.exp(-1./(z*z)) 
    else: 
     return 0 


>>> x = np.array([-10., 10.]) 
>>> x 
array([-10., 10.]) 
>>> c_inf_comp(x[0]) 
0 
>>> c_inf_comp(x[1]) 
0.99004983374916811 
>>> vfunz = np.vectorize(c_inf_comp) 
>>> vfunz(x) 
array([0, 0]) 

risposta

16

Perché non si specifica otypes (il tipo di dati di uscita) quando si vettorizzare la funzione, NumPy presuppone che si desidera restituire una matrice di int32 valori.

Quando proposta x la funzione vettorizzati vfunz primo vede -10., restituisce il numero intero 0, e così decide che la dtype dell'array restituito dovrebbe essere int32.

Per risolvere questo problema, specificare otypes essere np.float valori:

vfunz = np.vectorize(c_inf_comp, otypes=[np.float]) 

Si raggiunge quindi il risultato atteso:

>>> vfunz(x) 
array([ 0.  , 0.99004983]) 

(In alternativa, il problema può essere risolto restituendo un valore float in la condizione else di c_inf_comp, ovvero return 0.0. In questo modo, la funzione generata da np.vectorize(c_inf_comp) restituirà un array di valori float anche se vede prima un numero negativo.)

+1

Questo piccolo problema mi ha causato molto spreco di tempo ... Ecco un altro esempio che spiega la situazione: https://gist.github.com/drorata/dd9028c993b676328001c414ce822385 – Dror

Problemi correlati