Numpy 使用 if 语句进行向量化:与元素顺序不一致

问题描述 投票:0回答:1

使用以下两个简单的函数:

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.])

这是一个错误吗?

python arrays numpy vectorization
1个回答
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])
© www.soinside.com 2019 - 2024. All rights reserved.