私はPythonを使って気候モデルの出力を研究して、特定のタイプの嵐を見つける研究者です。私は8つの大きなnumpy配列(次元は109574 x 52 x 57)です。これらの配列は、その日に嵐があったことを示すために1で埋められています(最初の次元は時間です)。嵐がない場合は0です。他の2つの次元は緯度と経度です。重複をチェックする効率の向上 - Python
これらの配列からバックツーバックの日を削除する必要があります。たとえば、1日目と2日目に嵐があった場合、1回の嵐だけをカウントしたいと思います。 1日目、2日目、3日目に嵐があった場合は、合計2回の嵐のために1と3を数えたいと思っています.1〜4日には2回の嵐があります。 np.sumを使用して最後に嵐の数を発見し、時間軸に沿って配列の1を集計しました。
私はこれを達成するために次のコードを実行していますが、非常に遅いという問題に直面しています。他のデータセットに対してこの手順を繰り返す必要があるので、このプロセスを効率化する方法があるかどうか疑問に思っていました。私は下に私のコードを持っています、そして、私は何かを明確にすること以上に満足しています。
# If there is a storm that overlaps two two-day periods, only count it once
print("Eliminating doubles...")
for i in range(52):
for j in range(57):
print(i,j)
for k in range(109573):
if((storms1[k,i,j]) == 1 and (storms1[k+1,i,j] == 1)):
storms1[k,i,j] = 0
if((storms2[k,i,j]) == 1 and (storms2[k+1,i,j] == 1)):
storms2[k,i,j] = 0
if((storms3[k,i,j]) == 1 and (storms3[k+1,i,j] == 1)):
storms3[k,i,j] = 0
if((storms4[k,i,j]) == 1 and (storms4[k+1,i,j] == 1)):
storms4[k,i,j] = 0
if((storms5[k,i,j]) == 1 and (storms5[k+1,i,j] == 1)):
storms5[k,i,j] = 0
if((storms6[k,i,j]) == 1 and (storms6[k+1,i,j] == 1)):
storms6[k,i,j] = 0
if((storms7[k,i,j]) == 1 and (storms7[k+1,i,j] == 1)):
storms7[k,i,j] = 0
if((storms8[k,i,j]) == 1 and (storms8[k+1,i,j] == 1)):
storms8[k,i,j] = 0
誰かがループと配列を反復処理を示唆する前に、私はこの質問をする目的のためにそれらを簡素化するために、変数名を変更しました。
ありがとうございます。ここで
注:ブール値を減算すると、エラーが発生するため
astype
呼び出しはその値が1と0テストであっても、されています-nbityのブール型も8ビットであるため、int配列をブール値として扱います。これは型変換を節約します。 – Benjamin
どこでそれを行うのか分かりません。私はほとんど 'int8'に変換していますので、私は引き算できます。最後に.astype(storms.dtype)を置き換えることができると思います。 –
「ビュー」トリックは逆も同様です...しかし、そうですね、あなたのコードを少し速く読んでいます。 – Benjamin