首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >numpy.piecewise在使用lambda时返回错误的答案

numpy.piecewise在使用lambda时返回错误的答案
EN

Stack Overflow用户
提问于 2016-12-07 11:41:52
回答 1查看 372关注 0票数 2

我试图通过使用numpy.piecewise插入一个常量部分来“拼接”一个函数:

代码语言:javascript
复制
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都给了我一个零:

代码语言:javascript
复制
In[65]: new_func(15.0)
Out[65]: array(0.0)

我仔细看了一下numpy的代码。分段(不能很好地调试它),但似乎没有什么可以导致这种行为。将x转换为numpy.array没有帮助。我在这里做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-07 12:34:43

如果您输入了一个非标量的np.array,它就能工作。

代码语言:javascript
复制
>>> new_func(np.array([15]))
array([6])

只要稍微修改一下(0 <= x) & (x < bid_start),而不是0 <= x < bid_start,它也可以在扩展数组上工作:

代码语言:javascript
复制
>>> 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编写它,这是的方式,更快:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41016561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档