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.
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ụ,
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, 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, 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
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]]]
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: //stackoverflow.com/a/13849249/71522: this will fail when the vectors have either the same or the opposite direction. The correct implementation is here: //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
Đã 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 trongimport 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
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
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
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]]]
0Và 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
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]]]
2from 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
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]]]
4Lư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]]]
5Mã 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
Fakenfakenfaken
6.3824 Huy hiệu vàng25 Huy hiệu bạc28 Huy hiệu đồng4 gold badges25 silver badges28 bronze badges
3