numpy.vectorize devuelve valores incorrectos

Estoy teniendo algunos problemas con la función numpy.vectorize .

He definido una función que funciona bien para la entrada de un solo elemento pero la versión vectorizada devuelve resultados diferentes. ¿Qué estoy haciendo mal?

Código:

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

Debido a que no especifica otypes (el tipo de datos de salida) cuando vectoriza su función, NumPy asume que desea devolver una matriz de valores int32 .

Cuando se le da x la función vectorizada vfunz ve primero -10. , devuelve el entero 0 , y así decide que el dtype de la matriz devuelta debe ser int32 .

Para solucionar esto, especifique otypes como valores np.float :

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

A continuación, obtiene el resultado esperado:

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

(Alternativamente, el problema puede solucionarse devolviendo un valor flotante en la condición else de c_inf_comp , es decir, return 0.0 . De esa manera, la función generada por np.vectorize(c_inf_comp) devolverá una matriz de valores flotantes incluso si ve un valor negativo número primero.)