我在numpy.vectorize
功能方面遇到了一些问题。
我已经定义了一个适用于单个元素输入的函数,但是矢量化版本返回了不同的结果 - 我做错了什么?
代码:
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])
答案 0 :(得分:17)
因为在向量化函数时没有指定otypes
(输出数据类型),NumPy假定您要返回int32
值的数组。
当给定x
时,向量化函数vfunz
首先看到-10.
,返回整数0
,因此决定返回数组的dtype
应该是int32
。
要解决此问题,请将otypes
指定为np.float
值:
vfunz = np.vectorize(c_inf_comp, otypes=[np.float])
然后,您可以获得预期的结果:
>>> vfunz(x)
array([ 0. , 0.99004983])
(或者,可以通过在else
c_inf_comp
条件下返回一个浮点值来解决问题,即return 0.0
。这样,np.vectorize(c_inf_comp)
生成的函数即使它首先看到负数,也会返回一个浮点值数组。)