浮動小数点数の 2 つのリストがあり、それらの間の集合の差を計算したいと考えています。
numpy を使用して、最初に次のコードを作成しました。
aprows = allpoints.view([('',allpoints.dtype)]*allpoints.shape[1])
rprows = toberemovedpoints.view([('',toberemovedpoints.dtype)]*toberemovedpoints.shape[1])
diff = setdiff1d(aprows, rprows).view(allpoints.dtype).reshape(-1, 2)
これは、整数などに適しています。いくつかの幾何学的計算の結果である float 座標を持つ 2d ポイントの場合、有限の精度と丸め誤差の問題があり、集合の差がいくつかの等式を見逃す原因となります。今のところ、私ははるかに遅いことに頼りました:
diff = []
for a in allpoints:
remove = False
for p in toberemovedpoints:
if norm(p-a) < 0.1:
remove = True
if not remove:
diff.append(a)
return array(diff)
しかし、これを numpy で記述して速度を戻す方法はありますか?
残りのポイントにはまだ完全な精度を持たせたいので、最初に数値を丸め、次に設定差を行うことはおそらく先に進む方法ではないことに注意してください(またはそうですか?:))
動作するように見える scipy.KDTree に基づくソリューションを追加するように編集しました:
def remove_points_fast(allpoints, toberemovedpoints):
diff = []
removed = 0
# prepare a KDTree
from scipy.spatial import KDTree
tree = KDTree(toberemovedpoints, leafsize=allpoints.shape[0]+1)
for p in allpoints:
distance, ndx = tree.query([p], k=1)
if distance < 0.1:
removed += 1
else:
diff.append(p)
return array(diff), removed