【问题标题】:Going from a for loop to arrays in Python在 Python 中从 for 循环到数组
【发布时间】:2017-07-07 01:18:04
【问题描述】:
for i in range(2,Nx-2):
    lyr1[i]=lyr0[i]-coef*(lyr0[i]*(lyr0[i+1]-lyr0[i-1])/2+(dsqr/(deltax)**2)*(lyr0[i+2]-2*lyr0[i+1]+2*lyr0[i-1]-lyr0[i-2]))

lyr1=lyr0[0:Nx]-coef*(lyr0[0:Nx]*(lyr0[2:Nx]-lyr0[0:Nx-2])/2+(dsqr/(deltax)**2)*(lyr0[1:Nx+1]-2*lyr0[0:Nx]+2*lyr0[2:Nx-2]-lyr0[3:Nx-3]))

我正在尝试将我的 for 循环(上图)更改为对数组的操作。我目前收到广播错误,但我需要能够只选择数组的一部分以匹配我的数值积分方案。任何帮助是极大的赞赏。

【问题讨论】:

  • 这段代码在做什么。
  • 你在使用 numpy 吗?
  • 这是一个较长代码的sn-p,但它用于数值积分。我在 y 方向上有层(它们是离散时间的层),而 x 方向在每个时间层上都是空间的。我需要在 x 刻度上取点并加/减/除/乘以及时组成下一层。
  • 是的,我正在使用 numpy。很抱歉没有提到这一点。
  • 把它分成我们一眼就能看懂的片段。我还看到重复使用像 lyr0[0:Nx] 这样的索引。

标签: python python-3.x numpy


【解决方案1】:

问题在于您使用了不同维度的向量(由于您的切片),例如len(lyr0[0:Nx]) == 2 + len(lyr0[2:Nx])。 Numpy 尝试 broadcast 这些操作以匹配向量大小,但它们的维度不兼容(不是 1,不是彼此的倍数等)。

但是,广播并不是您首先想要做的(从您的循环实现来看)。看来您更愿意进行前瞻/回顾。尝试使用 numpy 的 roll 函数来显式移动 lyr0 中的值。

【讨论】:

    猜你喜欢
    • 2021-07-28
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2014-10-18
    • 2012-09-19
    • 2021-10-06
    • 2021-10-15
    • 1970-01-01
    相关资源
    最近更新 更多