2016-12-21 3 views
0

2つの点が絶対許容値の中で最も「ピジョンソニック」で単純な方法で一致しているかどうかチェックしたいと思います。一致点を確認する(公差内)

私は現在、「numpyの」組み込み関数allclose()を使用しています:

numpy.allclose(a, b, 0, tol)

しかし、私は可能であれば「非numpyの」解決策を探しています。

bに比べ

a = [1, 2, 3] 
b = [1.1, 2.1, 3.1] 
c = [1, 3, 3] 
tolerance = 0.5 

aは返す必要がありますcに比べtrue

aを返す必要がありますfalse

答えて

2

2次元のためには使用することができます。

>>> import math 
>>> same = lambda p1, p2, tol: math.hypot(p2[0] - p1[0], p2[1] - p1[1]) <= tol 
>>> a = [1, 2] 
>>> b = [1.1, 2.1] 
>>> c = [1, 3] 
>>> same(a, b, 0.5) 
True 
>>> same(b, c, 0.5) 
False 
>>> 

および多くのため:

multiHypot = lambda diffs: math.sqrt(sum(diff**2 for diff in diffs)) 
same = lambda p1, p2, tol: multiHypot(p2[i] - p1[i] for i in range(len(p1))) <= tol 

Rockcatさんのコメント(より効率的な)あたりの更新:

same = lambda p1, p2, tol: sum((p2[i] - p1[i])**2 for i in range(len(p1))) <= tol**2 

きれいバージョン(多分速い):

from operator import sub 
same = lambda p1, p2, tol: sum(x**2 for x in map(sub, p1, p2)) <= tol**2 
+0

このdoesnの2つ以上の次元で作業します。 –

+0

@JacobBond Yup、回答を –

+0

に更新しました。一般的に、perfomanceと丸め誤差によるしきい値を比較するとき、hypot(x)やsqrt(x)に基づく他の関数を避ける方が良いです。 'sqrt(x)<= tolerance'の代わりに' x <= tolerance ** 2'を使うべきです – Rockcat

関連する問題