gpt4 book ai didi

python - 使用 python/numpy 评估数组上的多变量函数

转载 作者:太空宇宙 更新时间:2023-11-03 11:23:59 37 4
gpt4 key购买 nike

我知道 python 允许在 numpy 数组 xarr = np.array([x0,x1,. ..xN]):

f(xarr) = np.array([f(x0), f(x1), ..., f(xN)])

但是,这似乎不适用于多变量函数的语法方面。假设我有一个实值函数 f(x,y),其中 x 和 y 是两个实数。是否有正确的语法来评估 [(0,0), (0,1), (1,0), (1,1)] 上的函数,避免循环 (这在 python 上总是很慢...)?

编辑:下面是涉及的函数:

我指的5元函数是:

def chisqr(BigOmega, inc, taustar, Q0, U0):
QU = QandU(nusdata, BigOmega, inc, taustar, Q0, U0)
Q = QU[:,0]
U = QU[:,1]
return 1./(2.*N) * (np.sum(((Q - Qs)/errQs)**2.) + np.sum(((U - Us)/errUs)**2.))

其中nusdata、Qs、Us是调用函数前定义的数组。该函数调用以下函数:

def QandU(nu, BigOmega, inc, taustar, Q0, U0):
lambdalong = nu+omega-np.pi/2.
tau3 = taustar * ((1+ecc*np.cos(nu))/(1-ecc**2.))**gamma
delQ = -tau3 * (1+np.cos(inc)*np.cos(inc))*(np.cos(2.*lambdalong) np.sin(inc)*np.sin(inc))
delU = -2*tau3*np.cos(inc)*np.sin(2*lambdalong)
Q = Q0 + delQ*np.cos(BigOmega) - delU * np.sin(BigOmega)
U = U0 + delQ*np.sin(BigOmega) + delU * np.cos(BigOmega)
bounds = (inc < 0) or (inc > np.pi/2.) or (BigOmega < -2*np.pi) or (BigOmega > 2*np.pi) or (taustar < 0.) or (taustar > 1.)
if bounds:
Q = 10E10
U = 10E10
#return U
return np.column_stack((Q,U))

所有不是函数参数的变量都在函数外定义。

最佳答案

用一个简单的例子:

def add_squares(x, y):
return x*x + y*y

xs = np.array([0, 0, 1, 1])
ys = np.array([0, 1, 1, 0])

res = add_squares(x, y)
np.array([0, 1, 2, 1])

您关于 f(xarr) = np.array([f(x0), f(x1), ..., f(xN)]) 的陈述通常不正确。这完全取决于 f 的定义。如果 f 仅由算术运算组成,则它为真,但一般情况下,它不是。


您的 QandU 函数应该几乎可以按预期工作:

def QandU(nu, BigOmega, inc, taustar, Q0, U0):
# left unchanged
lambdalong = nu+omega-np.pi/2.
tau3 = taustar * ((1+ecc*np.cos(nu))/(1-ecc**2.))**gamma
delQ = -tau3 * (1+np.cos(inc)*np.cos(inc))*(np.cos(2.*lambdalong) np.sin(inc)*np.sin(inc))
delU = -2*tau3*np.cos(inc)*np.sin(2*lambdalong)
Q = Q0 + delQ*np.cos(BigOmega) - delU * np.sin(BigOmega)
U = U0 + delQ*np.sin(BigOmega) + delU * np.cos(BigOmega)

# or doesn't vectorize, use bitwise or
bounds = (inc < 0) | (inc > np.pi/2.) | (BigOmega < -2*np.pi) | (BigOmega > 2*np.pi) | (taustar < 0.) | (taustar > 1.)

# if statements also don't vectorize
Q[bounds] = 10E10
U[bounds] = 10E10

# stacking is more trouble that it's worth
return Q, U

您的 chisqr 函数可能需要将一个 axis= 参数传递给 sum,具体取决于您要求和的维度。

关于python - 使用 python/numpy 评估数组上的多变量函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37417793/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com