【问题标题】:2D array into if statement without loop - Python二维数组进入没有循环的if语句 - Python
【发布时间】:2017-10-05 06:30:56
【问题描述】:

我定义了一个包含 if 语句的函数。然后我想在函数中传入 X 数组,这是一个二维数组。我尝试使用 np.all,但尽管它没有给出错误,但它将所有 X 值设置为“如果 abs(x)

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)

【问题讨论】:

  • 我可能遗漏了一些东西,但从你现在的代码来看,x 是一维数组?
  • 我不明白。目前,您拨打np.all(x)TrueFalse。如果你把它当作一个数字(就像你在调用abs&gt;/&lt; 时所做的那样),它要么是1 要么是0,所以abs 不是必需的。如果您更愿意使用np.all(abs(x))np.all(x&gt;L),则在您选择xyNone 时不会返回q2 中的3 个案例。你到底想要什么?
  • @Windmill 在代码末尾,X, Y = np.meshgrid(x,y), vel_x = u2(X,Y)
  • @Michael np.all(x) 是通过 if 语句将二维数组 X(大 X)放入函数的失败尝试。当我调用 vel_x = u2(X,Y) 时,作为 2D 数组的大 X 将通过调用 q2(x,y) 函数的 u2(x,y) 函数。在q2(x,y)函数中,有一个if语句,它不取二维数组X。我要找的是如何通过if语句获取X的值。
  • @Michael 所以也许说得更清楚,我希望它这样做: vel_x = u2(X,Y) >>>> 将 X, Y 通过 u2(x,y) 函数包括 q2(x) 函数。现在,当 X 被传递到 q2(x) 函数时,我希望 2D 数组 X 的每个值都通过它。我将在这里更改我的代码以免混淆。

标签: python function if-statement multidimensional-array


【解决方案1】:

您可以使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2014-11-27
    • 1970-01-01
    • 2013-07-18
    相关资源
    最近更新 更多