我是一名研究人員,使用Python來處理氣候模型輸出,以查找某些類型的風暴。我有8個大的numpy陣列(尺寸是109574 x 52 x 57)。這些數組填充1表示當天有風暴(第一維是時間),0表示沒有風暴。另外兩個維度是經度和緯度。提高重複檢查效率 - Python
我要消除這些陣列背到迴天。例如,如果第1天和第2天有暴風雨,我只想計1次風暴。如果第一天,第二天和第三天有暴風雨,我想只計算1和3共計兩次風暴,第1-4天會有兩次風暴,依此類推。我在最後使用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
在有人建議用循環遍歷數組之前,爲了提出這個問題,我改變了變量名以簡化它們。
感謝您的幫助。
請注意,您可以查看('a.view(numpy.bool)')8位int數組作爲布爾值,因爲Numpy布爾類型也是8位。這節省了類型轉換。 – Benjamin
不知道我會在那裏做。我主要轉換爲'int8',所以我可以減去。我想我可以在最後替換'.type(storms.dtype)'。 –
「視圖」技巧的作用也相反......但是,我讀了你的代碼太快了一點。 – Benjamin