我知道Python可以快速计算一个实值、单变量函数f(x)
在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))
除了函数参数外,所有变量都在函数外部定义。
f = lambda x: x[0]*x[1]
这样简单的代码就可以工作。 - wflynny