あなたが助けとヒントを求めているように:
私が最初に提案するのは、これは非効率的であり、numpy配列はそのために設計されていないため、numpy配列のループを避ける必要があるということです。numpy配列を使用している場合は、ベクトル化されたnumpy関数とインデックスを使用して、ポイントを並べ替え、重複を削除する必要があります。
パンダ(numpyの上に構築されている)には、C2H5OHによって提案されているように、配列をループしてポイントを取得するよりも高速なメソッドがDataFrames
組み込まれています。drop_duplicates
あなたはそれらを使用して比較することができますipython
:
import pandas as pd
from collections import OrderedDict
from itertools import groupby
def with_ordered_dict(x, y, z):
tmp = OrderedDict()
for point in zip(x, y, z):
tmp.setdefault(point[:2], point)
return tmp.values()
def with_groupby(x, y, z):
keyfunc = lambda p: p[:2]
mypoints = []
for k, g in groupby(sorted(zip(x, y, z), key=keyfunc), keyfunc):
mypoints.append(list(g)[0])
return mypoints
def with_dataframe(x, y, z):
df = pd.DataFrame({'x':x, 'y':y, 'z':z})
return df.drop_duplicates(cols=['x', 'y'])
In [140]: %timeit mypoints = with_ordered_dict(x, y, z)
1 loops, best of 3: 2.47 s per loop
In [141]: %timeit mypoints = with_groupby(x, y, z)
1 loops, best of 3: 4.22 s per loop
In [142]: %timeit mypoints = with_dataframe(x, y, z)
1 loops, best of 3: 713 ms per loop
したがって、500000のデータポイントを使用すると、パンダはを使用した場合よりも3〜4倍高速になり、。OrderedDict
を使用した場合よりも約6倍高速になりgroupby
ます。