我有一个函数,可以找到单位圆向量[1,0]
和单位圆上的向量之间的Angular 。
import numpy as np
def angle(a):
b = [0,1]
if a[1] >= 0:
return round(np.degrees(np.arccos(np.dot(a, b)/ (np.linalg.norm(a) * np.linalg.norm(b)))), 2)
else:
return 180 + round(np.degrees(np.arccos(np.dot(a, b)/ (np.linalg.norm(a) * np.linalg.norm(b)))), 2)
print(angle(np.array([1,0])))
90.0
print(angle(np.array([-4,2])))
63.43 # This value should be 150
print(angle(np.array([-1,0])))
90.0 # This value should be 180
print(angle(np.array([0,-1])))
360.0 # This value should be 270
字符串
- 如何确定输入
a
始终是2D向量? - 如何更改代码,使x轴以下的向量(即负y值)是否显示正确的值?
3条答案
按热度按时间9avjhtql1#
你把x向量搞错了。应该是这样
第一个月
假定第一个坐标是x轴,第二个坐标是y轴。如果你把这个正确的B向量,所有的计算工作如预期。
rpppsulh2#
定义一个期望输入的函数的一种方法是将两者作为单独的args(这也修复了一些bug并简化了获取Angular 值的逻辑):
字符串
顺便提及,
atan2
具有容易混淆的输入顺序y, x
。单独指定它们的一个优点是可以帮助避免这种情况。如果你想将输入保持为数组,下面的代码可以帮助你验证长度:型
cdmah0mi3#
要确定a始终是2D向量,您可以检查它的长度:
if len(a) == 2
.你还可以检查它是一个列表还是一个元组:if type(a) in [list, tuple] and len(a) == 2:
个编辑:我的坏刚刚注意到它实际上是numpy数组,在这种情况下:
if isinstance(x, np.ndarray) and x.shape[0] == 2
个编辑2:来自评论:
x.ndim == 2
听起来更好。