使用以下两个简单的函数:
def x(t):
return 0 if t < 0 else 1
def h(t):
return 0 if t < 0 else np.exp(-t)
应用
x = np.vectorize(x)
和 h = np.vectorize(h)
后,第一个行为符合预期,输出与输入数组中元素的顺序无关:
x(np.array([-1,0,1,2])) -> array([0, 1, 1, 1])
x(np.array([0,1,2,-1])) -> array([1, 1, 1, 0])
对于第二个函数,如果将小于零的值评估为第一个或最后一个元素,我会得到不同的结果...
h(np.array([-1,0,1,2])) -> array([0, 1, 0, 0])
h(np.array([0,1,2,-1])) -> array([1., 0.3678, 0.1353, 0.])
这是一个错误吗?
经过一番挖掘,事实证明这是预期的行为。如果未指定输出数据类型,则 Vectorize 从第一个元素确定它。对于
x
函数,输出类型始终为 int
。对于 h
函数,如果提供 -1
作为输入,则输出类型确定为 int
,并且以下非整数值将转换为 int
。
这可以通过强制输出类型为浮点数来简单地修复,例如通过返回值隐式
def h(t):
return 0. if t < 0 else np.exp(-t)
(注意 0 后面的“.”),或显式通过向量化的
otype
参数
h = np.vectorize(h, otypes=[float])