使用while和for语句迭代2d numpy数组

时间:2019-04-01 09:13:44

标签: python-3.x numpy for-loop while-loop

在下面提供的代码中,我尝试遍历2D numpy数组[i] [k] 最初,它是用Fortran 77编写的代码,它比我的祖父还要老。我正在尝试使其适应python。 (对于感兴趣的下落:这是一个简单的液压瞬态事件求解器) 请记住,所有变量都是在我的代码中引入的,因此我不会在此处粘贴。

  H = np.zeros((NS,50))
  Q = np.zeros((NS,50))

我在这里分配第一行值:

    for i in range(NS):
       H[0][i] = HR-i*R*Q0**2
       Q[0][i] = Q0

 CVP = .5*Q0**2/H[N]
 T = 0
 k = 0
 TAU = 1
 #Interior points:
 HP = np.zeros((NS,50))
 QP = np.zeros((NS,50))

 while T<=Tmax:
     T += dt
     k += 1
     for i in range(1,N):
         CP = H[k][i-1]+Q[k][i-1]*(B-R*abs(Q[k][i-1]))
         CM = H[k][i+1]-Q[k][i+1]*(B-R*abs(Q[k][i+1]))
         HP[k][i-1] = 0.5*(CP+CM)
         QP[k][i-1] = (HP[k][i-1]-CM)/B
 #Boundary Conditions:
 HP[k][0] = HR
 QP[k][0] = Q[k][1]+(HP[k][0]-H[k][1]-R*Q[k][1]*abs(Q[k][1]))/B
     if T == Tc:
         TAU = 0
         CV = 0
     else:
         TAU = (1.-T/Tc)**Em
         CV = CVP*TAU**2
     CP = H[k][N-1]+Q[k][N-1]*(B-R*abs(Q[k][N-1]))
     QP[k][N] = -CV*B+np.sqrt(CV**2*(B**2)+2*CV*CP)
     HP[k][N] = CP-B*QP[k][N]
     for i in range(NS):
         H[k][i] = HP[k][i]
         Q[k][i] = QP[k][i]

记住i用于行,k用于列 我期望的是,对于所有k个列,应该计算值,直到满足T <= Tmax条件为止。我无法弄清楚我的错误是什么,我遇到了以下错误:

 RuntimeWarning: divide by zero encountered in true_divide
 CVP = .5*Q0**2/H[N]

 RuntimeWarning: invalid value encountered in multiply
 QP[N][k] = -CV*B+np.sqrt(CV**2*(B**2)+2*CV*CP)

 QP[N][k] = -CV*B+np.sqrt(CV**2*(B**2)+2*CV*CP)
 ValueError: setting an array element with a sequence.

2 个答案:

答案 0 :(得分:1)

看着你的第一次迭代:

H = np.zeros((NS,50))
Q = np.zeros((NS,50))
for i in range(NS):
   H[0][i] = HR-i*R*Q0**2
   Q[0][i] = Q0

H的形状为(NS,50),但是当您遍历range(NS)时,会将那个索引应用于第二维。为什么?它不适用于尺寸为NS的尺寸吗?

numpy中,数组默认为'C'顺序。最后一个维度是最内在的。他们可以有一个F(fortran)订单,但是我们不要去那里。将2d数组视为表格,尽管numpy中没有正式的定义,但我们通常谈论的是行和列。

假设您想将第一列设置为以下值:

for i in range(NS):
    H[i, 0] = HR - i*R*Q0**2
    Q[i, 0] = Q0

但是我们可以一次分配整行或整列。我相信Fortran的新版本也具有这些“整个阵列”功能。

Q[:, 0] = Q0  
H[:, 0] = HR - np.arange(NS) * R * Q0**2

翻译为Python时要注意的一点。索引从0开始;范围和np.arange(...)也是如此。

H[0][i]在功能上与H[0,i]相同。但是,使用切片时,您必须使用H[:,i]格式。

我怀疑您的其他迭代也有类似的问题,但我现在将在此处停止。

答案 1 :(得分:0)

关于错误:

  • 第一个:
RuntimeWarning: divide by zero encountered in true_divide
 CVP = .5*Q0**2/H[N]

您将H初始化为零,因此它抱怨被零除是正常的。也许您应该添加一个条件。

  • 第三个:
 QP[N][k] = -CV*B+np.sqrt(CV**2*(B**2)+2*CV*CP)
 ValueError: setting an array element with a sequence.

您先定义CVP = .5*Q0**2/H[N],然后再定义CV = CVP*TAU**2,这是一个序列。然后,您尝试将其派生形式分配给作为元素的QP[N][K]。您正在尝试将一个数组插入一个值。

  • 对于第二个错误,我认为它可能与第三个错误有关。如果您能提供更多信息,我想尝试了解发生了什么。

希望这有所帮助。

相关问题