Python-扩展numpy数组更改向量化函数的所有值
我注意到在尝试矢量化以下凹凸函数时出现了一些奇怪的行为。它应该为开放区间(-1,1)中的任何输入返回正值,并为其他地方的输入返回0: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) 另一方面,当我尝试在包含(-
>>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. ])