2016-11-17 31 views
1

在給定範圍內搜索兩個數組中的元素我正在處理大數組的地球物理數據。我有兩個尺寸爲320x340的numpy陣列:第一個XLAT包含網格中每個點的緯度,第二個XLON包含網格中每個點的經度。所以每個i, j描述的地面點緯度XLAT[i][j]和經度XLON[i][j]使用numpy.where()

我有座標P_LATP_LON點,我必須找到距離給定點最近的4個點。首先,我寫了一個簡單的函數,它貫穿x軸和y軸上的所有點,但它使得320 * 340 = 108 800次迭代,並且工作非常緩慢(對於每個點約爲0.5秒):

for i in range(0, lat-1): 
      for j in range(0, lon-1): 

        if ST_LON >= XLON[i][j] and \ 
          ST_LON < XLON[i][j + 1] and \ 
          ST_LAT >= XLAT[i][j] and \ 
          ST_LAT < XLAT[i + 1][j]: 
          return (True, i, i + 1, j, j + 1) 

後來我發現約numpy.where()一些信息,並寫了這個代碼:

for i in range(0, lat): 
      rows = numpy.where((XLON[i] >= ST_LON - 0.5) & (XLON[i] <= ST_LON + 0.5)) 

     for j in rows[0]: 
      if ST_LON >= XLON[i][j] and \ 
          ST_LON < XLON[i][j + 1] and \ 
          ST_LAT >= XLAT[i][j] and \ 
          ST_LAT < XLAT[i + 1][j]: 
       return (True, i, i + 1, j, j + 1) 

此功能要快得多(〜0.015秒,每一點),但我不認爲這是正確的和美麗的解決方案

所以我的最後一個問題是我怎麼能找到兩個陣列中的項目,滿足以下條件:

XLON[i] <= ST_LON <= XLON[i][j+1]XLAT[i][j] <= ST_LAT <= XLAT[i+1][j]

,這應該迅速開展工作?

+0

你的意思XLON [i] [j],而不是XLON [i]符合條件嗎? – quantummind

+0

你已經設定了兩個目標。 1:找到最近的4個點。 2:找到滿足條件的項目。你想要什麼? – quantummind

+0

XLON和XLAT的尺寸均爲320x340。條件是找到4個最接近的點,我試着用給定的條件。 – Greg

回答

0

我不知道的編程任務,所以讓我在我自己的話再說一遍:

你有兩個2dim陣列XLAT和XLON。它們是某種翻譯數組,用於從某個網格獲取緯度/經度。

從你的代碼的例子,我的結論是: XLON [i] [j] == XLON [H] [J]適用於所有我,在範圍內H(0,LAT)?! (也許有一個很好的理由有一個對象,但它看起來不是很高性能)

所以最簡單的解決方案應該是隻把機器人尺寸seperately:

for i in range(0, lat-1): 
    if (XLON[i][0] >= ST_LON - 0.5) & (XLON[i][0] <= ST_LON + 0.5): 
     break 
for j in range(0, lon-1): 
    if (XLAT[0][j] >= ST_LAT - 0.5) & (XLAT[0][j] <= ST_LAT + 0.5)): 
     break 
return (True, i, i + 1, j, j + 1) 

你也可以用np.where替換if-break語句。

我不確定我是否正確。如果我的答案沒有幫助,那麼向我們提供一個帶有XLON的小型工作示例python代碼非常有用,XLAT縮小到例如5x4尺寸。

0

感謝所有答覆,我發現使用numpy.where()大條件的快速的解決方案,但它是一個有點不漂亮,而不是審美:)

#Calculate the step 
    dLAT = numpy.abs(self.XLON[0][1] - self.XLON[0][0]) * 3 
    dLON = numpy.abs(self.XLAT[1][0] - self.XLAT[0][0]) * 3 

    #Get the rows and cells satisfying the condition 
    rows, cells = numpy.where(((self.XLON >= ST_LON - dLON) & (self.XLON <= ST_LON + dLON)) & ((self.XLAT >= ST_LAT - dLAT) & (self.XLAT <= ST_LAT + dLAT))) 

    #Loop through all the values 
    for i in range(0, len(rows)): 

     #Get the indexes 
     current_lat = rows[i] 
     next_lat = rows[i] + 1 
     current_lon = cells[i] 
     next_lon = cells[i] + 1 

     #Check the point 
     if ST_LON >= self.XLON[current_lat][current_lon] and ST_LON < self.XLON[current_lat][next_lon] and \ 
      ST_LAT >= self.XLAT[current_lat][current_lon] and ST_LAT < self.XLAT[next_lat][current_lon]: 

      return(True, current_lat, next_lat, current_lon, next_lon) 

    return (False, 0, 0, 0, 0)