2017-07-07 6 views
-2
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ループを上記の操作を配列の操作に変更しようとしています。私は現在、ブロードキャストエラーが発生していますが、数値積分方式と一致するように配列の一部のみを選択できる必要があります。どんな助けでも大歓迎です。forループからPythonの配列への移動

+4

このコードは何の転用ですか。 –

+0

あなたはnumpyを使用していますか? – Barmar

+0

これはより長いコードのスニペットですが、数値的な統合のためのものです。私はy方向に層(離散時間の層である)を有し、x方向は各時間層上の空間である。私はxスケールでポイントを取る必要があります/時間を次の層を作るためにそれらを追加/減算/除算/乗算する必要があります。 – SDill

答えて

0

問題は、異なるサイズのベクトルを使用することです(スライシングのため)。たとえば、len(lyr0[0:Nx]) == 2 + len(lyr0[2:Nx])です。 Numpyはこれらの操作をベクトルサイズと一致させるためにbroadcastにしようとしますが、互換性のないディメンションを持っています(1ではなく、お互いの倍数などではありません)。

しかし、ブロードキャストは、まずループの実装から判断してやりたいことではありません。あなたはむしろ先読み/見返りをしたいと思うようです。 numpyのroll関数を代わりに使用して、lyr0の値を明示的にシフトしてみてください。

関連する問題