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