numpy 求x轴与单位圆上的向量的夹角

jchrr9hc  于 2023-08-05  发布在  其他
关注(0)|答案(3)|浏览(77)

我有一个函数,可以找到单位圆向量[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值)是否显示正确的值?
9avjhtql

9avjhtql1#

你把x向量搞错了。应该是这样
第一个月
假定第一个坐标是x轴,第二个坐标是y轴。如果你把这个正确的B向量,所有的计算工作如预期。

rpppsulh

rpppsulh2#

定义一个期望输入的函数的一种方法是将两者作为单独的args(这也修复了一些bug并简化了获取Angular 值的逻辑):

def angle(x, y):
    
    rad = np.arctan2(y, x)
    degrees = np.int(rad*180/np.pi)
    if degrees < 0:
        degrees = 360 + degrees
    return degrees

字符串
顺便提及,atan2具有容易混淆的输入顺序y, x。单独指定它们的一个优点是可以帮助避免这种情况。如果你想将输入保持为数组,下面的代码可以帮助你验证长度:

def angle(a):
    
    if len(a) != 2:
        raise IndexError("vector a expected to be length 2")        
    x = a[0]
    y = a[1]
    rad = np.arctan2(y, x)
    degrees = np.int(rad*180/np.pi)
    if degrees < 0:
        degrees = 360 + degrees
    return degrees

cdmah0mi

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听起来更好。

相关问题