numpy.vectorize returns incorrect values

2019-01-26 07:40发布

问题:

I am having some problems with the numpy.vectorize function.

I have defined a function that works well for single element input but the vectorized version returns different results - What am I doing wrong?

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

回答1:

Because you don't specify otypes (the output data type) when you vectorize your function, NumPy assumes you want to return an array of int32 values.

When given x the vectorized function vfunz first sees -10., returns the integer 0, and so decides that the dtype of the returned array should be int32.

To fix this, specify otypes to be np.float values:

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

You then get your expected result:

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

(Alternatively, the issue can be fixed by returning a float value in the else condition of c_inf_comp, i.e. return 0.0. That way, the function generated by np.vectorize(c_inf_comp) will return an array of float values even if it sees a negative number first.)