2017-05-07 92 views
0

我已经定义了一个包含if语句的函数。然后我想传入函数中的X数组,这是一个二维数组。我尝试使用np.all,但尽管它没有提供任何错误,但它将所有X值设置为“if abs(x)< L:”。我将如何能够将2D数组(X)正确传递到函数中?将二维数组转换为if语句无循环 - Python

x = np.arange(-10.,15.+1.,1.) 
y = np.arange(-4.,4.+0.1,0.1) 
eps = 0.1 
L = 2. 
k = np.pi/(2.*L) 

def q2(x): 
    if abs(x) < L: 
     return (((-3.*eps*np.cos(k*x))+(k*(np.sin(k*x)-np.exp(3.*eps*(x-L)))))/((9.*eps**2.) + k**2.)) 
    if x > L: 
     return 0. 
    if x < -L: 
     return (-k*(1.+np.exp2(-6.*eps*L))*np.exp(3.*eps*(x+L)))/((9.*eps**2.) + k**2.) 

def u2(x,y): 
    return 0.5*q2(x)*(y**2. - 3.)*np.exp(-0.25*y**2.) 

X,Y = np.meshgrid(x,y) 
vel_x=u2(X,Y) 
+0

我可能失去了一些东西,但是从你的代码现在,它看起来像'x'是一维数组? – Windmill

+0

我不明白。目前你可以调用'np.all(x)',它可以是'True'或'False'。如果你把它当成一个数字(就像你调用'abs'和'>'/'<'时所做的那样),它可以是'1'或'0',所以'abs'不是必需的。如果你想'np.all(abs(x))'或'np.all(x> L)',那么'q2'中的三种情况都没有达到你选择的'x'和'y'并返回“None”。你究竟想要什么? – Michael

+0

@Windmill在代码末尾,X,Y = np.meshgrid(x,y),vel_x = u2(X,Y) – JadeChee

回答

0

您可以使用numpy.where(CONDITION)获得索引数组,可用于访问只有你当前感兴趣的那些x部分:

def q2(x): 

    q = np.zeros(x.shape) 

    # for abs(x) < L 
    ind = np.where(np.abs(x) < L) 
    q[ind] = (((-3.*eps*np.cos(k*x[ind]))+(k*(np.sin(k*x[ind])-np.exp(3.*eps*(x[ind]-L)))))/((9.*eps**2.) + k**2.)) 

    # for x < -L 
    ind = np.where(x < -L) 
    q[ind] = (-k*(1.+np.exp2(-6.*eps*L))*np.exp(3.*eps*(x[ind]+L)))/((9.*eps**2.) + k**2.) 

    return q