私は長さ2016のリストを持っていますが、242だけがデータを含み、残りはNoneに設定されています。私の目的は、IDW(逆距離の重み付け)の単純な形式ですべてのギャップを埋めるために値を補間することです。 だから私のスクリプトのタスクは次のとおりです。はmyList リスト内の隣人を見つける最も効率的な方法
- 反復はmyListに値が含まれている場合(つまり、ない Noneです)あなたは「見つけた場合、単に
- それをコピーNone "をmyList内のすべてのアイテムまでの距離を計算して左と右の隣の位置/値を取得する
- 両隣からのギャップの補間値を計算します(離れた方が遠いほど、 )
我々は唯一の14項目(5つの有効なもの)の小さなリストを持っていると仮定します
myList = [26, None, None, None, 31, None, None, 58, None, 42, None, None, None, 79]
resultList = [None] * len(myList)
for i in range(len(myList):
if not myList[i] is None:
resultList[i] = myList[i]
else:
distance = [i - j for j in range(len(myList)) if not myList[j] is None]
neighbors = min([n for n in dist if n>0]), max([n for n in dist if n<0])
# rest of the interpolation (not important for my question):
neighbors_c = [(1/float(n))**2 for n in neighbors]
c_sum = sum(neighbors_c)
neighbors_c = [n/c_sum for n in neighbors_c]
resultList = myList[i-neighbors[0]]*neighbors_c[0] + myList[i-neighbors[1]]*neighbors_c[1]
私は多くの多くのデータセットのためにそれをやっています。私はこの方法がデータセットあたり約0.59秒かかることを知りました。私の悩みは、私のリストがすべてソートされているという事実ですが、私はそれから2つの値しか必要としません。 99%の距離は何のためにも計算されません。すなわち、2つのを試みるために私を導いた:ijが負になった後、その後明らかにそれが最も近い値に走ったので、反復処理を停止します。
だからではなく、リストの内包表記:
distance = [i - j for j in range(len(myList)) if not myList[j] is None]
私はループのための適切な操作を行います
dist = []
for j in range(len(myList)):
if not myList[j] is None:
dist.append(i-j)
if i-j < 0: break
この方法では、データセットごとに0.38秒まで低下することができました。 myList内のすべてのアイテムを繰り返し処理する場合、この2番目のメソッドは最初は素早く(アイテムは2番目、3番目、4番目、...後にヒットし、すぐに終了します)、最後のアイテムは改善されません。 j = 0である。
すべての距離をチェックする必要はなく、最大のマイナスおよびスモールをプラスにしなくても、データセット内の特定の数値の2つの近隣を見つける手早い方法があると思いますか?
また、私はPythonにはかなり新しくなっていますので、私のスクリプトで他の非平凡な表現が見つかったら教えてください。皆さんありがとう!
Numpyは、[them](http://docs.scipy.org/doc/scipy/reference/spatial.html#nearest-neighbor-queries)を見ることができるいくつかの最近傍アルゴリズムを提供しています。 – albert
そこにそれをすべて行う 'pandas.Series.interpolate'関数です。 – pacholik
[Pythonを使った逆距離加重(IDW)補間]に関する質問への回答はどうですか(http://stackoverflow.com/questions/3104781/inverse-distance-weighted-idw-interpolation-with-python)? – ojdo