繁体   English   中英

条件分段函数

[英]Conditional Piecewise Function

通过提供到目前为止的尝试,然后再提供我的意图和意见,可能会更容易解释这一点。

import numpy as np
from numpy import sqrt, arcsin, arcsinh

# Returns roots of quadratic (or lack of)
def roots(a, b, c):
    b24ac = b*b - 4*a*c
    if a == 0 or b24ac < 0:
        return np.nan, np.nan
    else:
        l = (-b - sqrt(b24ac))/(2*a)
        r = (-b + sqrt(b24ac))/(2*a)
        if l > r:
            l, r = r, l
        return l, r

# Some numeric functions
def pw1(z, a, b, c):
    return -arcsin((2*a*z+b)/sqrt(b*b - 4*a*c))/sqrt(-a)

def pw2(z, a, b, c):
    return arcsinh((2*a*z+b)/sqrt(4*a*c - b*b))/sqrt(a)

# Function incorporating above definitions w/ conditions/domains
def func(z, a, b, c):
    b24ac = b*b - 4*a*c
    l, r = roots(*abc)
    conditions = [(b24ac > 0 and a < 0) and (l < z and z < r),
                  (b24ac < 0 and a > 0)]
    choices = [pw1(z, a, b, c), 
               pw2(z, a, b, c)] 
    return np.select(conditions, choices)

这是我尝试创建作为条件分段函数的python函数。 出于数学上的好奇,这是$ [ax ^ 2 + bx + c] ^ {-1/2} $积分的完整定义的一部分。 必要的细节是我需要一个以域和其他参数为条件的函数。 我研究了numpy的piecewiseselect函数。 对于其条件列表, Piecewise仅接受域上的逻辑(不接受参数)。 除非我缺少任何东西,否则这似乎对我不起作用。 Select给了我最大的成功。 我唯一遇到的问题是它没有评估其域的域条件:

--->  conditions = [(b24ac > 0 and a < 0) and (l < z and z < r),
                  (b24ac < 0 and a > 0)]

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

最后,它评估所有选择(与piecewise提供的功能相对的结果),然后从条件列表中选择要返回的一个(注释出and (l < z ...条件):

c:\program files\python36\lib\site-packages\ipykernel_launcher.py:6: 
RuntimeWarning: invalid value encountered in sqrt

我本周前开始使用一堆elif语句。 这仅适用于浮点数,不适用于数组。 我正在使用numpy,然后在域上使用此函数(或任何其他函数)求值。 然后,我从numpy了解了piecewiseselect并开始使用它们。

我真的很想用Python的方式来做到这一点。 一个仅对所需条件/域求值的numpy数组。 因此,表现得像piecewise但具有通用条件,如select 任何帮助和建议,我们将不胜感激! 谢谢。

b24ac标识符肯定是描述性的,但是大多数人可能会认为它是有discriminant

用你自己的

您在抱怨自己知道如何计算所需的结果,但是手头的numpy工具似乎不合适。 因此,编写您自己的函数fn并使用.apply(fn)nditer 注意,您可以安排所有需要的参数出现在额外的列中,并使该函数一次处理一行。

我没有听说过关于速度的问题,这是反对这种自定义函数的通常论点。

使用np.piecewise

我同意您的观点, 逐段()似乎适合您的需求。 似乎缺少的方面是在将其分段传递之前,使用四个参数对函数进行了定制。 满足此需求的理想选择是functools.partial()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM