- Notifications
You must be signed in to change notification settings - Fork 46.7k
/
Copy patheuclidean_distance.py
65 lines (53 loc) · 1.89 KB
/
euclidean_distance.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
from __future__ importannotations
importtyping
fromcollections.abcimportIterable
importnumpyasnp
Vector=typing.Union[Iterable[float], Iterable[int], np.ndarray] # noqa: UP007
VectorOut=typing.Union[np.float64, int, float] # noqa: UP007
defeuclidean_distance(vector_1: Vector, vector_2: Vector) ->VectorOut:
"""
Calculate the distance between the two endpoints of two vectors.
A vector is defined as a list, tuple, or numpy 1D array.
>>> float(euclidean_distance((0, 0), (2, 2)))
2.8284271247461903
>>> float(euclidean_distance(np.array([0, 0, 0]), np.array([2, 2, 2])))
3.4641016151377544
>>> float(euclidean_distance(np.array([1, 2, 3, 4]), np.array([5, 6, 7, 8])))
8.0
>>> float(euclidean_distance([1, 2, 3, 4], [5, 6, 7, 8]))
8.0
"""
returnnp.sqrt(np.sum((np.asarray(vector_1) -np.asarray(vector_2)) **2))
defeuclidean_distance_no_np(vector_1: Vector, vector_2: Vector) ->VectorOut:
"""
Calculate the distance between the two endpoints of two vectors without numpy.
A vector is defined as a list, tuple, or numpy 1D array.
>>> euclidean_distance_no_np((0, 0), (2, 2))
2.8284271247461903
>>> euclidean_distance_no_np([1, 2, 3, 4], [5, 6, 7, 8])
8.0
"""
returnsum((v1-v2) **2forv1, v2inzip(vector_1, vector_2)) ** (1/2)
if__name__=="__main__":
defbenchmark() ->None:
"""
Benchmarks
"""
fromtimeitimporttimeit
print("Without Numpy")
print(
timeit(
"euclidean_distance_no_np([1, 2, 3], [4, 5, 6])",
number=10000,
globals=globals(),
)
)
print("With Numpy")
print(
timeit(
"euclidean_distance([1, 2, 3], [4, 5, 6])",
number=10000,
globals=globals(),
)
)
benchmark()