通过提供我迄今为止的尝试,然后提供我的意图+注释,这可能更容易解释。你知道吗
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的piecewise
和select
函数。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,让这个函数(或任何真正的函数)在域上求值是我所追求的。然后我学习了piecewise
和select
并开始玩这些,来自numpy。你知道吗
我真的很想用Python的方法来做这个。对numpy数组求值,并且只对所需的条件/域求值。所以,行为类似于piecewise
,但有多种条件作用,如select
。非常感谢您的帮助和建议!谢谢。你知道吗
b24ac
标识符当然是描述性的, 但大多数人可能会把它命名为discriminant
。你知道吗用你自己的
你在抱怨你知道如何计算期望的结果, 但手头的numpy工具似乎不太合适。 因此,编写自己的函数
fn
,并使用.apply(fn)
或nditer。 注意,您可以安排所有需要的参数显示在额外的列中, 并让函数一次处理一行。你知道吗我没听到有人担心速度, 这是反对这种自定义函数的常见论据。你知道吗
使用np.分段你知道吗
我同意你的看法。 似乎缺少的方面是用四个参数定制函数 在把它们逐段传递给你之前。 一个很好的匹配这种需要的是functools.partial()。你知道吗
相关问题 更多 >
编程相关推荐