Hướng dẫn how do you calculate euclidean distance in python? - làm thế nào để bạn tính toán khoảng cách euclidean trong python?

Cải thiện bài viết

Lưu bài viết

Nói một cách đơn giản, khoảng cách Euclide là ngắn nhất giữa 2 điểm bất kể kích thước. Trong bài viết này để tìm khoảng cách Euclide, chúng tôi sẽ sử dụng thư viện Numpy. Thư viện này được sử dụng để điều khiển mảng đa chiều một cách rất hiệu quả. Hãy để thảo luận về một vài cách để tìm khoảng cách Euclide của Thư viện Numpy.

Phương pháp số 1: Sử dụng linalg.norm () & nbsp; 

Python3

2.23606797749979
1
2.23606797749979
2

2.23606797749979
3
2.23606797749979
4
2.23606797749979
5
2.23606797749979
6
2.23606797749979
7
2.23606797749979
8
2.23606797749979
7
dist = numpy.linalg.norm(a-b)
0
dist = numpy.linalg.norm(a-b)
1

dist = numpy.linalg.norm(a-b)
2
2.23606797749979
4
2.23606797749979
5
2.23606797749979
6
2.23606797749979
7
2.23606797749979
6
2.23606797749979
7
2.23606797749979
6
dist = numpy.linalg.norm(a-b)
1

sP = set(points)
pA = point
distances = np.linalg.norm(sP - pA, ord=2, axis=1.)  # 'distances' is a list
1
2.23606797749979
4
sP = set(points)
pA = point
distances = np.linalg.norm(sP - pA, ord=2, axis=1.)  # 'distances' is a list
3
sP = set(points)
pA = point
distances = np.linalg.norm(sP - pA, ord=2, axis=1.)  # 'distances' is a list
4
sP = set(points)
pA = point
distances = np.linalg.norm(sP - pA, ord=2, axis=1.)  # 'distances' is a list
5

sP = set(points)
pA = point
distances = np.linalg.norm(sP - pA, ord=2, axis=1.)  # 'distances' is a list
6
sP = set(points)
pA = point
distances = np.linalg.norm(sP - pA, ord=2, axis=1.)  # 'distances' is a list
7

Output:

2.23606797749979

Phương pháp số 2: Sử dụng dot () & nbsp; 

Python3

2.23606797749979
1
2.23606797749979
2

2.23606797749979
3
2.23606797749979
4
2.23606797749979
5
2.23606797749979
6
2.23606797749979
7
2.23606797749979
8
2.23606797749979
7
dist = numpy.linalg.norm(a-b)
0
dist = numpy.linalg.norm(a-b)
1

dist = numpy.linalg.norm(a-b)
2
2.23606797749979
4
2.23606797749979
5
2.23606797749979
6
2.23606797749979
7
2.23606797749979
6
2.23606797749979
7
2.23606797749979
6
dist = numpy.linalg.norm(a-b)
1

sP = set(points)
pA = point
distances = np.linalg.norm(sP - pA, ord=2, axis=1.)  # 'distances' is a list
1
2.23606797749979
4
sP = set(points)
pA = point
distances = np.linalg.norm(sP - pA, ord=2, axis=1.)  # 'distances' is a list
3
sP = set(points)
pA = point
distances = np.linalg.norm(sP - pA, ord=2, axis=1.)  # 'distances' is a list
4
sP = set(points)
pA = point
distances = np.linalg.norm(sP - pA, ord=2, axis=1.)  # 'distances' is a list
5

Phương pháp số 2: Sử dụng dot () & nbsp;

sP = set(points)
pA = point
distances = np.linalg.norm(sP - pA, ord=2, axis=1.)  # 'distances' is a list
6
def distance(pointA, pointB, _norm=np.linalg.norm):
    return _norm(pointA - pointB)
7

Output:

2.23606797749979

>>> dis.dis(distance)
  2           0 LOAD_GLOBAL              0 (np)
              2 LOAD_ATTR                1 (linalg)
              4 LOAD_ATTR                2 (norm)
              6 LOAD_FAST                0 (pointA)
              8 LOAD_FAST                1 (pointB)
             10 BINARY_SUBTRACT
             12 CALL_FUNCTION            1
             14 STORE_FAST               2 (dist)

  3          16 LOAD_FAST                2 (dist)
             18 RETURN_VALUE
8
2.23606797749979
4
2.23606797749979
3
sP = set(points)
pA = point
distances = np.linalg.norm(sP - pA, ord=2, axis=1.)  # 'distances' is a list
4
def distance(pointA, pointB, _norm=np.linalg.norm):
    return _norm(pointA - pointB)
2
 

Python3

2.23606797749979
1
2.23606797749979
2

2.23606797749979
3
2.23606797749979
4
2.23606797749979
5
2.23606797749979
6
2.23606797749979
7
2.23606797749979
8
2.23606797749979
7
dist = numpy.linalg.norm(a-b)
0
dist = numpy.linalg.norm(a-b)
1

dist = numpy.linalg.norm(a-b)
2
2.23606797749979
4
2.23606797749979
5
2.23606797749979
6
2.23606797749979
7
2.23606797749979
6
2.23606797749979
7
2.23606797749979
6
dist = numpy.linalg.norm(a-b)
1

sP = set(points)
pA = point
distances = np.linalg.norm(sP - pA, ord=2, axis=1.)  # 'distances' is a list
1
2.23606797749979
4
sP = set(points)
pA = point
distances = np.linalg.norm(sP - pA, ord=2, axis=1.)  # 'distances' is a list
3
sP = set(points)
pA = point
distances = np.linalg.norm(sP - pA, ord=2, axis=1.)  # 'distances' is a list
4
sP = set(points)
pA = point
distances = np.linalg.norm(sP - pA, ord=2, axis=1.)  # 'distances' is a list
5

sP = set(points)
pA = point
distances = np.linalg.norm(sP - pA, ord=2, axis=1.)  # 'distances' is a list
6
def distance(pointA, pointB, _norm=np.linalg.norm):
    return _norm(pointA - pointB)
7

Output:

2.23606797749979

Tôi muốn giải thích về câu trả lời đơn giản với các ghi chú hiệu suất khác nhau. np.linalg.norm có lẽ sẽ làm nhiều hơn bạn cần:

dist = numpy.linalg.norm(a-b)

Đầu tiên - chức năng này được thiết kế để hoạt động qua danh sách và trả về tất cả các giá trị, ví dụ: Để so sánh khoảng cách từ

2.23606797749979
07 với tập hợp các điểm
2.23606797749979
08:

sP = set(points)
pA = point
distances = np.linalg.norm(sP - pA, ord=2, axis=1.)  # 'distances' is a list

Hãy nhớ một số điều:

  • Các cuộc gọi chức năng Python rất tốn kém.
  • [Thường xuyên] Python không tra cứu tên bộ đệm.

Vì thế

def distance(pointA, pointB):
    dist = np.linalg.norm(pointA - pointB)
    return dist

không phải là ngây thơ như vẻ ngoài của nó.

>>> dis.dis(distance)
  2           0 LOAD_GLOBAL              0 (np)
              2 LOAD_ATTR                1 (linalg)
              4 LOAD_ATTR                2 (norm)
              6 LOAD_FAST                0 (pointA)
              8 LOAD_FAST                1 (pointB)
             10 BINARY_SUBTRACT
             12 CALL_FUNCTION            1
             14 STORE_FAST               2 (dist)

  3          16 LOAD_FAST                2 (dist)
             18 RETURN_VALUE

Đầu tiên - mỗi khi chúng tôi gọi nó, chúng tôi phải tìm kiếm "NP" toàn cầu, một bộ tra cứu phạm vi cho "Linalg" và tìm kiếm một phạm vi cho "định mức", và chi phí đơn thuần gọi chức năng có thể tương đương với hàng chục Python hướng dẫn.

Cuối cùng, chúng tôi đã lãng phí hai hoạt động để lưu trữ kết quả và tải lại để trả lại ...

Pass đầu tiên khi cải tiến: Tra cứu nhanh hơn, bỏ qua cửa hàng

def distance(pointA, pointB, _norm=np.linalg.norm):
    return _norm(pointA - pointB)

Chúng tôi nhận được sự hợp lý hơn nhiều:

>>> dis.dis(distance)
  2           0 LOAD_FAST                2 (_norm)
              2 LOAD_FAST                0 (pointA)
              4 LOAD_FAST                1 (pointB)
              6 BINARY_SUBTRACT
              8 CALL_FUNCTION            1
             10 RETURN_VALUE

Mặc dù vậy, các cuộc gọi trên đầu vẫn là một số công việc. Và bạn sẽ muốn thực hiện các điểm chuẩn để xác định xem bạn có thể tự mình làm toán tốt hơn không:

def distance(pointA, pointB):
    return (
        ((pointA.x - pointB.x) ** 2) +
        ((pointA.y - pointB.y) ** 2) +
        ((pointA.z - pointB.z) ** 2)
    ) ** 0.5  # fast sqrt

Trên một số nền tảng,

2.23606797749979
09 nhanh hơn
2.23606797749979
10. Số dặm của bạn có thể khác nhau.

**** Ghi chú hiệu suất nâng cao.

Tại sao bạn tính khoảng cách? Nếu mục đích duy nhất là hiển thị nó,

2.23606797749979
0

di chuyển theo. Nhưng nếu bạn đang so sánh khoảng cách, kiểm tra phạm vi, v.v., tôi muốn thêm một số quan sát hiệu suất hữu ích.

Hãy để Lừa lấy hai trường hợp: Sắp xếp theo khoảng cách hoặc loại bỏ danh sách đến các mục đáp ứng hạn chế phạm vi.

2.23606797749979
1

Điều đầu tiên chúng ta cần nhớ là chúng ta đang sử dụng Pythagoras để tính khoảng cách (

2.23606797749979
11) vì vậy chúng ta thực hiện rất nhiều cuộc gọi
2.23606797749979
12. Toán 101:

2.23606797749979
2

Nói tóm lại: Cho đến khi chúng tôi thực sự yêu cầu khoảng cách trong một đơn vị x thay vì x^2, chúng tôi có thể loại bỏ phần khó nhất của các tính toán.

2.23606797749979
3

Tuyệt vời, cả hai chức năng không có bất kỳ rễ vuông đắt tiền nào. Điều đó sẽ nhanh hơn nhiều, nhưng trước khi bạn đi xa hơn, hãy tự mình kiểm tra: Tại sao sort_things_by_distance cần từ chối trách nhiệm "ngây thơ" cả hai lần ở trên? Trả lời ở phía dưới (*A1).

Chúng ta có thể cải thiện in_range bằng cách chuyển đổi nó thành một trình tạo:

2.23606797749979
4

Điều này đặc biệt có lợi ích nếu bạn đang làm một cái gì đó như:

2.23606797749979
5

Nhưng nếu điều tiếp theo bạn sẽ làm đòi hỏi một khoảng cách,

2.23606797749979
6

Xem xét các bộ dữ liệu năng suất:

2.23606797749979
7

Điều này có thể đặc biệt hữu ích nếu bạn có thể kiểm tra phạm vi ('Tìm những thứ gần X và trong NM của Y', vì bạn không phải tính toán khoảng cách nữa).

Nhưng nếu chúng ta đang tìm kiếm một danh sách thực sự lớn của

2.23606797749979
13 và chúng ta dự đoán rất nhiều trong số họ không được xem xét?

Thực sự có một tối ưu hóa rất đơn giản:

2.23606797749979
8

Liệu điều này có hữu ích hay không sẽ phụ thuộc vào kích thước của 'những thứ'.

2.23606797749979
9

Và một lần nữa, hãy xem xét năng suất dist_sq. Ví dụ hotdog của chúng tôi sau đó trở thành:

2.23606797749979
0

.

Khoảng cách Euclide ở Python ở đâu mà không bị numpy?

Phương pháp chung mà không sử dụng numpy: sqrs = (point1 [0] - point2 [0]) ** 2 + (point1 [1] - point2 [1]) ** 2 + (point1 [2] - point2 [2])**2.euc_dist = math.sqrt (sqrs) in ("Khoảng cách euclidian giữa điểm1 và điểm2:", euc_dist)sqrs = (point1 [0] - point2 [0])**2 + (point1[1] - point2[1])**2 + (point1[2] - point2[2])**2. euc_dist = math. sqrt (sqrs) print ("Euclidian distance between point1 and point2: ", euc_dist)

Làm thế nào để tính toán khoảng cách?

Trong phương pháp này, trước tiên chúng tôi khởi tạo hai mảng numpy.Sau đó, chúng tôi lấy sự khác biệt của hai mảng, tính toán sản phẩm chấm của kết quả và chuyển đổi kết quả.Sau đó, chúng tôi lấy căn bậc hai của câu trả lời.Đây là một cách khác để thực hiện khoảng cách Euclide.