2016-05-24 52 views
3

我知道蟒允许numpy的阵列xarr = np.array([x0,x1,...xN])上的实值,一个可变功能f(x)的快速evalutation:与Python阵列上评价一个多变量函数/ numpy的

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-变量函数I指的是:

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)) 

所有变量,不是函数的自变量定义在函数外。

+2

你可以给你想要评估的功能吗? – syntonym

+0

你只需要定义你的函数来接受一个参数(元组或对),但对元组的元素进行操作。像'f = lambda x:x [0] * x [1]'这样简单的东西可以工作。 – wflynny

+0

通常有这样做的方法,但没有一个通用的答案。有些功能很简单,有些功能是不可能的。你需要显示实际的功能。 – tom10

回答

2

用一个简单的例子:

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,正是取决于其尺寸您要总结过去。