2016-11-17 9 views
1

私は大規模な地球物理データの配列を扱っています。私は320x340のサイズを持つ2つのnumpy配列を持っています:最初のXLATは、グリッド内のすべての点の緯度を含み、第2のXLONは、グリッド内のすべての点の経度を含みます。だから、i, jは地面の点を緯度がXLAT[i][j]、経度がXLON[i][j]であると説明しています。numpy.where()を使用して、指定された範囲の2つの配列で要素を検索します。

私は座標が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

2つの目標を設定しました。 1:最も近い4点を見つける。 2:条件を満たすアイテムを見つける。あなたは何を望んでいるのですか? – quantummind

+0

XLONとXLATのサイズはどちらも320x340です。条件は4つの最も近い点を見つけることであり、私は与えられた条件でそれを試しました。 – Greg

答えて

0

私はプログラミング作業について確認していないので、私は私自身の言葉で繰り返してみましょう:

次の2つの2dim配列XLATとXLONを持っています。いくつかのグリッドから緯度/経度を取得するために配列を変換するものです。私は結論あなたのコードの例から

XLON [I] [J] == XLON [H] [j]は、範囲内の全てのi、H(0、LAT)のために有効なのですか?! は(たぶんそのオブジェクトを持つことは良い理由があるが、それは非常にパフォーマンスを見ていない)ので、最も簡単な解決策は、単に別々ボットの寸法を治療するためのあるべき

:あなたがすることもでき

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) 

をif-break文をnp.whereに置き換えます。

私はあなたが正しいかどうかわかりません。私の答えが役に立たなければ、XLON、XLATが5x4次元に縮小された小さな実例のPythonコードを私たちに提供することは非常に便利です。すべての返信用

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) 
関連する問題