2016-06-15 4 views
0

私は大域的な緯度と経度を持つ大きなデータセットを持っています。しかし、私は特定の地域を見るだけに興味があるので、この地域の外にあるすべての緯度/経度を除外したいと思います。問題は、データを解析するif文を使用していますが、時間がかかりすぎるということです。これを達成するためのより速い方法がありますか?大きなデータセットをすばやくフィルタリングするにはどうすればよいですか?

データはnetCDFファイルから得られ、辞書に格納することができます。私は北緯10度から北緯80度の間の緯度と、-170度から-50度の間の経度しか必要としません。これまで私が試したことは次のとおりです。

ret_dict = {} 
with Dataset(filename,'r') as fid: 
    ret_dict['time'] = fid.variables['timeObs'][:] 
    sort_order = np.argsort(ret_dict['time']) 
    lat1 = [i for i in fid.variables['latitude'][:][sort_order] if fid.variables['latitude'][:][sort_order] > 10 ] 
    lat2 = [i for i in lat1 if lat1 < 80] 

上記のコードは、経度に対して繰り返すことができます。しかし、これは大量のデータでは遅すぎます。それは私に指数を与えないので、私は元の緯度と経度のペアを維持することを確認します。すべての変数のデータをすばやく切り詰めるにはどうすればよいですか?

編集:以下の答えは質問の最初の部分では正しいですが、フィルタリングされた緯度のインデックスを使用して他の変数も切り捨てようとしています。私がしようとしています:

lon = [j for i,(j,i) in zip(fid.variables['longitude'][:],fid.variables['longitude']) if 10<i<80] 

は、しかし、私はエラーを取得しています:***はTypeError:「numpy.float32」オブジェクトは、あなたのデータをソート必要何らかの理由がある

+0

これは前に回答されていますhttp://stackoverflow.com/questions/29135885/netcdf4- 35320631#35320631 – N1B4

答えて

0

反復可能なされていませんか?フィルタリングはちょうどO(n)ですが、並べ替えは高価な操作O(nlogn)です。ソートが要件でない場合は、1回のフィルタ操作でそうすることができます。これは私が与えられた情報の限られた量を把握することができます最速の方法です

lat = [i for i in fid.variables['latitude'][:] if 10 < i < 80 ] 

(あなたはこのビットを変更する必要があるかもしれませんので、私はあなたのデータを知らない、覚えておいてください)。これはまだ長すぎる場合は、我々はさらに多くのお手伝いをしようとすることができるように、より多くの情報を与える:)

をEDITED

+0

エラーが発生しています:**** ValueError:複数の要素を持つ配列の真理値があいまいです。 a.any()またはa.all()を使用します。私は緯度/経度のペアが一緒に残るようにデータをソートしています。これは必要ではないですか? – manateejoe

+0

私は間違ったミスをしてそれを修正するために編集しました。ごめんなさい。また、ペアが一緒になるようにソートする必要はほとんどありません。これはあなた自身で確認できます。 – Brian

+0

私の質問の2番目の部分をさらに明確にするために編集しました – manateejoe

関連する問題