2016-08-03 8 views
5

入れ子にされたループをベクトル化することを検討しています。これは300,000個のリストのリストで動作し、これらのリストのそれぞれに3つの値が含まれています。ネストされたループは、各リストの値を他のリストの対応する値と比較し、最大差0.1の対応する値を持つリストインデックスのみを追加します。したがって、[0.234,0.456,0.567]を含むリストと、[0.246,0.479,0.580]を含むリストは、対応する値(すなわち、0.234と0.246; 0.456と0.479; 0.567と0.580)は、 0.1未満である。入れ子のループをベクトル化する

私は現在、以下のネストループを使用していますが、現在は約58時間かかります(合計90兆回の反復)。

import numpy as np 
variable = np.random.random((300000,3)).tolist() 
out1=list() 
out2=list() 
for i in range(0:300000): 
    for j in range(0:300000): 
     if ((i<j) and ((abs(variable[i][0]-variable[j][0]))<0.1) and ((abs(variable[i][1]-variable[j] [1]))<0.1) and ((abs(variable[i][2]-variable[j][2]))<0.1)): 
     out1.append(i) 
     out2.append(j) 
+0

あなたの '変数'はランダムです、実際には何かをシミュレートしていますか? – Julien

+0

はい、これは単なる例です。実際には、シミュレーションで生成されたリストのリストを持っています。 – JBorg

答えて

3

scipy.spatialを参照してください。このような空間クエリを効率的に解決するための多くの機能を備えています。 KDTrees特に:

import scipy.spatial 
out = scipy.spatial.cKDTree(variable).query_pairs(r=0.1, p=np.infinity) 
+0

これを試してみました。それは "フロートが必要です"を返しています。私はそれが単純なものだと仮定しています。お返事をありがとうございます! – JBorg

+0

ああ、私はドキュメントを誤解しました。彼らはこの主題に関して特に明確である。編集をお試しください。 「無限大ノルム」は、あなたが探しているメトリックにまで沸騰するはずです。いずれかの成分の最大絶対値。 –

+0

効率を上げるためには、ndarrayを優先してリストを完全に除外することがベストであることに注意してください。これはあなたの入力にも適用されますが、出力にも適用されます。この呼び出しにoutput_type = 'ndarray' kwargを追加できることに注意してください。 –

3

NumPy配列に変換すると、後でNumPy関数を使いやすくなります。次に、2つのアプローチが提案される。

アプローチ#1

numpyの放送は、3Dアレイにそれらを拡張し、ベクトル化方法で操作を実行するために使用することができます。

th = 0.1 # Threshold 
arr = np.asarray(variable) 
R,C = np.triu_indices(arr.shape[0],1) 
mask = (np.abs(arr[R] - arr[C])<th).all(-1) 
out1,out2 = R[mask], C[mask] 
- などの反復のために責任を負うことになるの選択インデックスを使用してメモリ効率を中心とした

th = 0.1 # Threshold 
arr = np.asarray(variable) 
out1,out2 = np.where(np.triu((np.abs(arr[:,None,:] - arr) < th).all(-1),1)) 

アプローチ#2

代替実装 - したがって、我々はそうのような実装を持っているでしょう

+0

もしあなたがテラバイトのRAMを持っていればそれはうまくいくでしょう。 –

+0

@EelcoHoogendoorn 'Approach#2'はそれほど重くないかもしれません:) – Divakar

+0

これを試しましたが、メモリエラーが出ています。わずか30,000リストでそれをもう一度試して、まだ実行しています。私はそれがまだかなり時間がかかると思っていますか? 256Gb RAMで動作しています – JBorg

関連する問題