Python-扩展numpy数组更改向量化函数的所有值

Python-扩展numpy数组更改向量化函数的所有值,python,arrays,numpy,vectorization,Python,Arrays,Numpy,Vectorization,我注意到在尝试矢量化以下凹凸函数时出现了一些奇怪的行为。它应该为开放区间(-1,1)中的任何输入返回正值,并为其他地方的输入返回0: >>import numpy as np >>def bump(x): if np.abs(x)<1: return np.exp(-1/(1-x**2)) else: return 0 >>vbump=np.vectorize(bump) 另一方面,当我尝试在包含(-

我注意到在尝试矢量化以下凹凸函数时出现了一些奇怪的行为。它应该为开放区间(-1,1)中的任何输入返回正值,并为其他地方的输入返回0:

>>import numpy as np

>>def bump(x):
    if np.abs(x)<1:
        return np.exp(-1/(1-x**2))
    else:
        return 0

>>vbump=np.vectorize(bump)
另一方面,当我尝试在包含(-1,1)之外的值的数组上求值时,我得到所有的零,即使对于应该为正的值:

>>x2=np.linspace(-1.1,1.1,10)
>>vbump(x2)

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
为什么会这样?我对python和numpy还比较陌生,但从我的理解来看,当我对函数进行矢量化时,它应该允许函数在列表元素上进行线程化。为什么放置较大的数组会影响其他地方的元素计算

我应该补充一点,我已经找到了一个解决方案,解决了在数组上计算凹凸函数的直接问题,使用

>>np.piecewise(x, [x <=-1, x >= 1,(-1<x)&(x<1)], [0,0,lambda t:np.exp(-1/(1-t**2))])

>np.分段(x,[x=1,(-1)作为
np.矢量化的文档说明:

向量化的
输出的数据类型是通过使用输入的第一个元素调用函数来确定的。这可以通过指定
otypes
参数来避免

当第一个值为-1.1时,函数的返回值为整数0,因此该数据类型变为整数数据类型(具体取决于您的设置;对于我,它是int32):

0
更改为
0.0
(因此您总是返回一个浮点数),或者指定
otypes

>>> vbump = np.vectorize(bump, otypes=[float])
>>> vbump(np.linspace(-1.1, 1.1, 10))
array([ 0.        ,  0.02396887,  0.20269374,  0.31495442,  0.36234271,
        0.36234271,  0.31495442,  0.20269374,  0.02396887,  0.        ])

np.vectorize
的文档所述:

向量化的
输出的数据类型是通过使用输入的第一个元素调用函数来确定的。这可以通过指定
otypes
参数来避免

当第一个值为-1.1时,函数的返回值为整数0,因此该数据类型变为整数数据类型(具体取决于您的设置;对于我,它是int32):

0
更改为
0.0
(因此您总是返回一个浮点数),或者指定
otypes

>>> vbump = np.vectorize(bump, otypes=[float])
>>> vbump(np.linspace(-1.1, 1.1, 10))
array([ 0.        ,  0.02396887,  0.20269374,  0.31495442,  0.36234271,
        0.36234271,  0.31495442,  0.20269374,  0.02396887,  0.        ])
副本的副本
>>> vbump = np.vectorize(bump, otypes=[float])
>>> vbump(np.linspace(-1.1, 1.1, 10))
array([ 0.        ,  0.02396887,  0.20269374,  0.31495442,  0.36234271,
        0.36234271,  0.31495442,  0.20269374,  0.02396887,  0.        ])