2014-10-11 16 views
9

Ich habe einige Probleme mit der numpy.vectorize Funktion.numpy.vectorize gibt falsche Werte zurück

Ich habe eine Funktion definiert, die gut für Einzelelementeingabe funktioniert, aber die vektorisierte Version gibt unterschiedliche Ergebnisse zurück - Was mache ich falsch?

Code:

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]) 

Antwort

16

Weil Sie nicht otypes (die Ausgangsdatentyp) angeben, wenn Sie Ihre Funktion vektorisiert, NumPy vorausgesetzt, dass Sie eine Reihe von int32 Werte zurückgeben möchten.

Wenn x die vektorisierten Funktion vfunz erste sieht -10. gegeben, gibt die ganze Zahl 0, und entscheidet, so dass die dtype des zurückgegebenen Arrays int32 sein sollte.

Um dies zu beheben, geben Sie otypesnp.float Werte zu sein:

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

Sie dann Ihre erwartete Ergebnis:

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

(Alternativ kann das Problem durch Rückgabe eines Float-Wert festgelegt werden, in Die else Bedingung von c_inf_comp, dh return 0.0. Auf diese Weise wird die von np.vectorize(c_inf_comp) generierte Funktion ein Array von Float-Werten zurückgeben, auch wenn es zuerst eine negative Zahl sieht.)

+1

Dieses kleine Problem verursachte mir eine Menge Zeitverschwendung ... Hier ist ein anderes Beispiel, das die Situation erklärt: https://gist.github.com/drorata/dd9028c993b676328001c414ce822385 – Dror

Verwandte Themen