numpy.vectorize 返回不正确的值
Posted
技术标签:
【中文标题】numpy.vectorize 返回不正确的值【英文标题】:numpy.vectorize returns incorrect values 【发布时间】:2014-12-06 14:57:09 【问题描述】: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])
【问题讨论】:
【参考方案1】:由于您在对函数进行向量化时没有指定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])
(或者,可以通过在c_inf_comp
的else
条件下返回一个浮点值来解决该问题,即return 0.0
。这样,np.vectorize(c_inf_comp)
生成的函数将返回一个浮点值数组,甚至如果它首先看到一个负数。)
【讨论】:
这个小问题让我浪费了很多时间......这是另一个解释这种情况的例子:gist.github.com/drorata/dd9028c993b676328001c414ce822385 为什么这是默认行为?以上是关于numpy.vectorize 返回不正确的值的主要内容,如果未能解决你的问题,请参考以下文章
Jax 矢量化:vmap 和/或 numpy.vectorize?
python Python:numpy.vectorize(a,b)