用python/numpy计算数组上的多变量函数

2024-10-01 07:47:41 发布

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

我知道python允许对numpy数组xarr = np.array([x0,x1,...xN])上的实值单变量函数f(x)进行快速求值:

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

然而,对于一个多变量函数来说,这似乎并不适用于语法。假设我有一个实值函数f(x,y),其中x和y是两个实数。有没有正确的语法来计算函数,比如,[(0,0), (0,1), (1,0), (1,1)],避免循环(在python上总是很慢?在

编辑:涉及的功能如下:

我指的五变量函数是:

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是在调用函数之前定义的数组。函数调用以下函数:

^{pr2}$

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


Tags: 函数np语法数组arrayincx1qu
1条回答
网友
1楼 · 发布于 2024-10-01 07:47:41

举个简单的例子:

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)
^{pr2}$

你所说的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函数可能需要一个传递给sumaxis=参数,具体取决于要求和的维度。在

相关问题 更多 >