条件分段函数

2024-09-30 16:39:15 发布

您现在位置:Python中文网/ 问答频道 /正文

通过提供我迄今为止的尝试,然后提供我的意图+注释,这可能更容易解释。你知道吗

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,让这个函数(或任何真正的函数)在域上求值是我所追求的。然后我学习了piecewiseselect并开始玩这些,来自numpy。你知道吗

我真的很想用Python的方法来做这个。对numpy数组求值,并且只对所需的条件/域求值。所以,行为类似于piecewise,但有多种条件作用,如select。非常感谢您的帮助和建议!谢谢。你知道吗


Tags: orandof函数numpyreturndefnp
1条回答
网友
1楼 · 发布于 2024-09-30 16:39:15

b24ac标识符当然是描述性的, 但大多数人可能会把它命名为discriminant。你知道吗

用你自己的

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

我没听到有人担心速度, 这是反对这种自定义函数的常见论据。你知道吗

使用np.分段你知道吗

我同意你的看法。 似乎缺少的方面是用四个参数定制函数 在把它们逐段传递给你之前。 一个很好的匹配这种需要的是functools.partial()。你知道吗

相关问题 更多 >