簡體   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