我试图通过使用numpy.piecewise在其中插入一个常量部分来“拼接”一个函数:
import numpy as np
func = lambda x: 20 -x
bid_price = 15.0
bid_power = 1.0
bid_start = 5.0
new_func = lambda x: np.piecewise(x, [0 <= x < bid_start,
(x>= bid_start) & (x < bid_start + bid_power), x >= bid_start + bid_power],
[lambda t: func(t), lambda t : bid_price,
lambda t: func(t - bid_power)])
虽然函数给出了与第一个条件匹配的x的正确结果,但是任何其他x都给出了零:
In[65]: new_func(15.0)
Out[65]: array(0.0)
我查看了numpy的代码。分段(不能完全调试它),但似乎没有任何东西导致这种行为。将x转换为numpy.array并没有帮助。我在这里做错了什么?
答案 0 :(得分:0)
嗯,如果您输入非标量 np.array
,它就有效:
>>> new_func(np.array([15]))
array([6])
稍加修改(0 <= x) & (x < bid_start)
而不是0 <= x < bid_start
它也适用于扩展数组:
>>> new_func(np.arange(20))
array([20, 19, 18, 17, 16, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2])
我猜np.piecewise
可能不是为了接受标量(毕竟它是数组的替代函数),或者它是一个Bug。但是如果你想处理标量,你应该用纯粹的python编写它的方式更快:
def new_func(x):
if x < 0:
raise ValueError()
elif x < bid_start:
return 20 - x
elif x < bid_start + bid_power:
return bid_price
else:
return 20 - x + bid_power