Hướng dẫn how do you find the angle between two vectors in 3d python? - Làm thế nào để bạn tìm thấy góc giữa hai vectơ trong 3d python?

Tôi cần xác định (các) góc giữa hai vectơ n chiều trong Python. Ví dụ: đầu vào có thể là hai danh sách như sau:

import math

def dotproduct(v1, v2):
  return sum((a*b) for a, b in zip(v1, v2))

def length(v):
  return math.sqrt(dotproduct(v, v))

def angle(v1, v2):
  return math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))
6 và
import math

def dotproduct(v1, v2):
  return sum((a*b) for a, b in zip(v1, v2))

def length(v):
  return math.sqrt(dotproduct(v, v))

def angle(v1, v2):
  return math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))
7.

Hướng dẫn how do you find the angle between two vectors in 3d python? - Làm thế nào để bạn tìm thấy góc giữa hai vectơ trong 3d python?

Gabriel

38.4K71 Huy hiệu vàng221 Huy hiệu bạc383 Huy hiệu Đồng71 gold badges221 silver badges383 bronze badges

Khi được hỏi ngày 13 tháng 5 năm 2010 lúc 14:06May 13, 2010 at 14:06

1

Lưu ý: Tất cả các câu trả lời khác ở đây sẽ thất bại nếu hai vectơ có cùng một hướng (ví dụ,

import math

def dotproduct(v1, v2):
  return sum((a*b) for a, b in zip(v1, v2))

def length(v):
  return math.sqrt(dotproduct(v, v))

def angle(v1, v2):
  return math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))
8,
import math

def dotproduct(v1, v2):
  return sum((a*b) for a, b in zip(v1, v2))

def length(v):
  return math.sqrt(dotproduct(v, v))

def angle(v1, v2):
  return math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))
8) hoặc các hướng ngược lại (Ex,
from numpy import (array, dot, arccos, clip)
from numpy.linalg import norm

u = array([1.,2,3,4])
v = ...
c = dot(u,v)/norm(u)/norm(v) # -> cosine of the angle
angle = arccos(clip(c, -1, 1)) # if you really want the angle
0,
import math

def dotproduct(v1, v2):
  return sum((a*b) for a, b in zip(v1, v2))

def length(v):
  return math.sqrt(dotproduct(v, v))

def angle(v1, v2):
  return math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))
8).
: all of the other answers here will fail if the two vectors have either the same direction (ex,
import math

def dotproduct(v1, v2):
  return sum((a*b) for a, b in zip(v1, v2))

def length(v):
  return math.sqrt(dotproduct(v, v))

def angle(v1, v2):
  return math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))
8,
import math

def dotproduct(v1, v2):
  return sum((a*b) for a, b in zip(v1, v2))

def length(v):
  return math.sqrt(dotproduct(v, v))

def angle(v1, v2):
  return math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))
8) or opposite directions (ex,
from numpy import (array, dot, arccos, clip)
from numpy.linalg import norm

u = array([1.,2,3,4])
v = ...
c = dot(u,v)/norm(u)/norm(v) # -> cosine of the angle
angle = arccos(clip(c, -1, 1)) # if you really want the angle
0,
import math

def dotproduct(v1, v2):
  return sum((a*b) for a, b in zip(v1, v2))

def length(v):
  return math.sqrt(dotproduct(v, v))

def angle(v1, v2):
  return math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))
8).

Đây là một chức năng sẽ xử lý chính xác các trường hợp sau:

import numpy as np

def unit_vector(vector):
    """ Returns the unit vector of the vector.  """
    return vector / np.linalg.norm(vector)

def angle_between(v1, v2):
    """ Returns the angle in radians between vectors 'v1' and 'v2'::

            >>> angle_between((1, 0, 0), (0, 1, 0))
            1.5707963267948966
            >>> angle_between((1, 0, 0), (1, 0, 0))
            0.0
            >>> angle_between((1, 0, 0), (-1, 0, 0))
            3.141592653589793
    """
    v1_u = unit_vector(v1)
    v2_u = unit_vector(v2)
    return np.arccos(np.clip(np.dot(v1_u, v2_u), -1.0, 1.0))

Đã trả lời ngày 12 tháng 12 năm 2012 lúc 21:47Dec 12, 2012 at 21:47

David Woleverdavid WoleverDavid Wolever

Phù vàng 143K84 Huy hiệu vàng332 Huy hiệu bạc84 gold badges332 silver badges492 bronze badges

9

import math

def dotproduct(v1, v2):
  return sum((a*b) for a, b in zip(v1, v2))

def length(v):
  return math.sqrt(dotproduct(v, v))

def angle(v1, v2):
  return math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))

Lưu ý: Điều này sẽ thất bại khi các vectơ có cùng một hướng hoặc ngược lại. Việc thực hiện chính xác là tại đây: https://stackoverflow.com/a/13849249/71522: this will fail when the vectors have either the same or the opposite direction. The correct implementation is here: https://stackoverflow.com/a/13849249/71522

Đã trả lời ngày 13 tháng 5 năm 2010 lúc 14:14May 13, 2010 at 14:14

Alex Martellialex MartelliAlex Martelli

829K164 Huy hiệu vàng1205 Huy hiệu bạc1384 Huy hiệu đồng164 gold badges1205 silver badges1384 bronze badges

13

Sử dụng Numpy (rất được khuyến khích), bạn sẽ làm:

from numpy import (array, dot, arccos, clip)
from numpy.linalg import norm

u = array([1.,2,3,4])
v = ...
c = dot(u,v)/norm(u)/norm(v) # -> cosine of the angle
angle = arccos(clip(c, -1, 1)) # if you really want the angle

Hướng dẫn how do you find the angle between two vectors in 3d python? - Làm thế nào để bạn tìm thấy góc giữa hai vectơ trong 3d python?

Đã trả lời ngày 13 tháng 5 năm 2010 lúc 14:13May 13, 2010 at 14:13

Olivier Verdierolivier VerdierOlivier Verdier

45.4K26 Huy hiệu vàng97 Huy hiệu bạc90 Huy hiệu Đồng26 gold badges97 silver badges90 bronze badges

5

Khả năng khác chỉ sử dụng

from numpy import (array, dot, arccos, clip)
from numpy.linalg import norm

u = array([1.,2,3,4])
v = ...
c = dot(u,v)/norm(u)/norm(v) # -> cosine of the angle
angle = arccos(clip(c, -1, 1)) # if you really want the angle
2 và nó cung cấp cho bạn góc bên trong

import numpy as np

p0 = [3.5, 6.7]
p1 = [7.9, 8.4]
p2 = [10.8, 4.8]

''' 
compute angle (in degrees) for p0p1p2 corner
Inputs:
    p0,p1,p2 - points in the form of [x,y]
'''

v0 = np.array(p0) - np.array(p1)
v1 = np.array(p2) - np.array(p1)

angle = np.math.atan2(np.linalg.det([v0,v1]),np.dot(v0,v1))
print np.degrees(angle)

Và đây là đầu ra:

In [2]: p0, p1, p2 = [3.5, 6.7], [7.9, 8.4], [10.8, 4.8]

In [3]: v0 = np.array(p0) - np.array(p1)

In [4]: v1 = np.array(p2) - np.array(p1)

In [5]: v0
Out[5]: array([-4.4, -1.7])

In [6]: v1
Out[6]: array([ 2.9, -3.6])

In [7]: angle = np.math.atan2(np.linalg.det([v0,v1]),np.dot(v0,v1))

In [8]: angle
Out[8]: 1.8802197318858924

In [9]: np.degrees(angle)
Out[9]: 107.72865519428085

Đã trả lời ngày 1 tháng 2 năm 2016 lúc 15:17Feb 1, 2016 at 15:17

Hướng dẫn how do you find the angle between two vectors in 3d python? - Làm thế nào để bạn tìm thấy góc giữa hai vectơ trong 3d python?

MK83MK83MK83

1.36210 huy hiệu bạc11 huy hiệu đồng10 silver badges11 bronze badges

2

Nếu bạn đang làm việc với các vectơ 3D, bạn có thể thực hiện điều này một cách chính xác bằng cách sử dụng VG của Toolbelt. Đó là một lớp ánh sáng trên đỉnh của Numpy.

import numpy as np
import vg

vec1 = np.array([1, 2, 3])
vec2 = np.array([7, 8, 9])

vg.angle(vec1, vec2)

Bạn cũng có thể chỉ định góc xem để tính toán góc thông qua phép chiếu:

vg.angle(vec1, vec2, look=vg.basis.z)

Hoặc tính toán góc đã ký thông qua phép chiếu:

vg.signed_angle(vec1, vec2, look=vg.basis.z)

Tôi đã tạo ra thư viện tại lần khởi động cuối cùng của mình, nơi nó được thúc đẩy bởi các mục đích sử dụng như thế này: những ý tưởng đơn giản là dài dòng hoặc mờ đục trong numpy.

Đã trả lời ngày 4 tháng 4 năm 2019 lúc 13:29Apr 4, 2019 at 13:29

Paulmelnikowpaulmelnikowpaulmelnikow

16.6K7 Huy hiệu vàng61 Huy hiệu bạc113 Huy hiệu đồng7 gold badges61 silver badges113 bronze badges

Cách dễ dàng để tìm góc giữa hai vectơ (hoạt động cho vectơ n chiều),

Mã Python:

import numpy as np

vector1 = [1,0,0]
vector2 = [0,1,0]

unit_vector1 = vector1 / np.linalg.norm(vector1)
unit_vector2 = vector2 / np.linalg.norm(vector2)

dot_product = np.dot(unit_vector1, unit_vector2)

angle = np.arccos(dot_product) #angle in radian

Đã trả lời ngày 5 tháng 4 năm 2020 lúc 13:15Apr 5, 2020 at 13:15

Hướng dẫn how do you find the angle between two vectors in 3d python? - Làm thế nào để bạn tìm thấy góc giữa hai vectơ trong 3d python?

Kevin Patelkevin PatelKevin Patel

5559 Huy hiệu bạc10 Huy hiệu Đồng9 silver badges10 bronze badges

Giải pháp của David Wolever là tốt, nhưng

Nếu bạn muốn có các góc đã ký, bạn phải xác định xem một cặp đã cho ở phải hay thuận tay trái (xem Wiki để biết thêm thông tin).signed angles you have to determine if a given pair is right or left handed (see wiki for further info).

Giải pháp của tôi cho điều này là:

def unit_vector(vector):
    """ Returns the unit vector of the vector"""
    return vector / np.linalg.norm(vector)

def angle(vector1, vector2):
    """ Returns the angle in radians between given vectors"""
    v1_u = unit_vector(vector1)
    v2_u = unit_vector(vector2)
    minor = np.linalg.det(
        np.stack((v1_u[-2:], v2_u[-2:]))
    )
    if minor == 0:
        raise NotImplementedError('Too odd vectors =(')
    return np.sign(minor) * np.arccos(np.clip(np.dot(v1_u, v2_u), -1.0, 1.0))

Nó không hoàn hảo vì

from numpy import (array, dot, arccos, clip)
from numpy.linalg import norm

u = array([1.,2,3,4])
v = ...
c = dot(u,v)/norm(u)/norm(v) # -> cosine of the angle
angle = arccos(clip(c, -1, 1)) # if you really want the angle
3 này nhưng đối với trường hợp của tôi, nó hoạt động tốt. Hành vi này có thể được sửa chữa (Nguyên nhân tay được xác định cho bất kỳ cặp nào) nhưng nó cần nhiều mã hơn mà tôi muốn và phải viết.

Đã trả lời ngày 9 tháng 6 năm 2019 lúc 15:24Jun 9, 2019 at 15:24

Hướng dẫn how do you find the angle between two vectors in 3d python? - Làm thế nào để bạn tìm thấy góc giữa hai vectơ trong 3d python?

Peppersgt Peppersgtsgt pepper

4247 Huy hiệu bạc13 Huy hiệu Đồng7 silver badges13 bronze badges

Đối với một số ít người có thể có (do biến chứng SEO) đã kết thúc ở đây cố gắng tính toán góc giữa hai dòng trong Python, như trong các dòng hình học

from numpy import (array, dot, arccos, clip)
from numpy.linalg import norm

u = array([1.,2,3,4])
v = ...
c = dot(u,v)/norm(u)/norm(v) # -> cosine of the angle
angle = arccos(clip(c, -1, 1)) # if you really want the angle
4, có một giải pháp tối thiểu dưới đây (sử dụng mô -đun
from numpy import (array, dot, arccos, clip)
from numpy.linalg import norm

u = array([1.,2,3,4])
v = ...
c = dot(u,v)/norm(u)/norm(v) # -> cosine of the angle
angle = arccos(clip(c, -1, 1)) # if you really want the angle
5, nhưng có thể dễ dàng sửa đổi không ):

import math

def dotproduct(v1, v2):
  return sum((a*b) for a, b in zip(v1, v2))

def length(v):
  return math.sqrt(dotproduct(v, v))

def angle(v1, v2):
  return math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))
0

Và việc sử dụng sẽ là

import math

def dotproduct(v1, v2):
  return sum((a*b) for a, b in zip(v1, v2))

def length(v):
  return math.sqrt(dotproduct(v, v))

def angle(v1, v2):
  return math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))
1

Đã trả lời ngày 21 tháng 4 năm 2019 lúc 0:53Apr 21, 2019 at 0:53

Hướng dẫn how do you find the angle between two vectors in 3d python? - Làm thế nào để bạn tìm thấy góc giữa hai vectơ trong 3d python?

Dựa trên câu trả lời tuyệt vời của SGT Pepper và thêm hỗ trợ cho các vectơ phù hợp cộng với thêm tốc độ hơn 2 lần

import math

def dotproduct(v1, v2):
  return sum((a*b) for a, b in zip(v1, v2))

def length(v):
  return math.sqrt(dotproduct(v, v))

def angle(v1, v2):
  return math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))
2

from numpy import (array, dot, arccos, clip)
from numpy.linalg import norm

u = array([1.,2,3,4])
v = ...
c = dot(u,v)/norm(u)/norm(v) # -> cosine of the angle
angle = arccos(clip(c, -1, 1)) # if you really want the angle
6 Kết quả mà không bị tê

  • 359 Pha ± 2,86 Pha mỗi vòng (trung bình ± std. Dev. Của 7 lần chạy, 1000 vòng mỗi)µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Và với

  • 151 Pha ± 820 ns mỗi vòng (trung bình ± std. Dev. Của 7 lần chạy, 10000 vòng mỗi)ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

Đã trả lời ngày 13 tháng 1 năm 2020 lúc 22:05Jan 13, 2020 at 22:05

crizcraigcrizcraigcrizCraig

8.0785 Huy hiệu vàng53 Huy hiệu bạc52 Huy hiệu Đồng5 gold badges53 silver badges52 bronze badges

Sử dụng một số chức năng từ Numpy.

import math

def dotproduct(v1, v2):
  return sum((a*b) for a, b in zip(v1, v2))

def length(v):
  return math.sqrt(dotproduct(v, v))

def angle(v1, v2):
  return math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))
3

Đã trả lời ngày 25 tháng 4 năm 2021 lúc 12:35Apr 25, 2021 at 12:35

Hướng dẫn how do you find the angle between two vectors in 3d python? - Làm thế nào để bạn tìm thấy góc giữa hai vectơ trong 3d python?

Sử dụng Numpy và chăm sóc các lỗi làm tròn của Bandgap:

import math

def dotproduct(v1, v2):
  return sum((a*b) for a, b in zip(v1, v2))

def length(v):
  return math.sqrt(dotproduct(v, v))

def angle(v1, v2):
  return math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))
4

Lưu ý, hàm này sẽ ném một ngoại lệ nếu một trong các vectơ có độ lớn bằng không (chia cho 0).

Đã trả lời ngày 12 tháng 3 năm 2013 lúc 23:16Mar 12, 2013 at 23:16

PacePacePace

39,8K12 Huy hiệu vàng114 Huy hiệu bạc147 Huy hiệu đồng12 gold badges114 silver badges147 bronze badges

0

Cách tiếp cận truyền thống để có được một góc giữa hai vectơ (nghĩa là

from numpy import (array, dot, arccos, clip)
from numpy.linalg import norm

u = array([1.,2,3,4])
v = ...
c = dot(u,v)/norm(u)/norm(v) # -> cosine of the angle
angle = arccos(clip(c, -1, 1)) # if you really want the angle
7, như được trình bày trong các câu trả lời khác) bị mất ổn định số trong một số trường hợp góc. Mã sau đây hoạt động cho các chiều n và trong tất cả các trường hợp góc (nó không kiểm tra các vectơ có độ dài bằng không, nhưng điều đó rất dễ thêm, như thể hiện trong một số câu trả lời khác). Xem ghi chú dưới đây.

import math

def dotproduct(v1, v2):
  return sum((a*b) for a, b in zip(v1, v2))

def length(v):
  return math.sqrt(dotproduct(v, v))

def angle(v1, v2):
  return math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))
5

Mã này được điều chỉnh từ việc thực hiện Julia bởi Jeffrey Sarnoff (giấy phép MIT), lần lượt dựa trên các ghi chú này của Giáo sư W. Kahan (trang 15).

Đã trả lời ngày 20 tháng 1 lúc 16:06Jan 20 at 16:06

Hướng dẫn how do you find the angle between two vectors in 3d python? - Làm thế nào để bạn tìm thấy góc giữa hai vectơ trong 3d python?

Fakenfakenfaken

6.3824 Huy hiệu vàng25 Huy hiệu bạc28 Huy hiệu đồng4 gold badges25 silver badges28 bronze badges

3

Làm thế nào để bạn tìm thấy góc trong Python?

Hàm góc () được sử dụng khi chúng ta muốn tính toán góc của đối số phức tạp.Một số phức được thể hiện bằng cách x + yi, trong đó x và y là số thực và i = (-1)^1/2.Góc được tính bằng công thức tan-1 (x/y). is used when we want to compute the angle of the complex argument. A complex number is represented by “ x + yi ” where x and y are real number and i= (-1)^1/2 . The angle is calculated by the formula tan-1(x/y).

Làm thế nào để bạn tìm thấy góc giữa trục 3D và vector?

Để tìm góc giữa một vectơ và trục X ..
48. Để tìm góc giữa một vectơ và trục X ..
Góc giữa vectơ ¯p =^i+^j+^k và vectơ đơn vị dọc theo trục x là ..
Góc giữa vectơ ¯p =^i+^j+^k và vectơ đơn vị dọc theo trục x là ..
A = i + j.Góc giữa vectơ và trục x là gì ..