选择范围内的角度

2024-04-26 18:01:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我想检查numpy数组中的哪些角度在给定的alpha+/-delta范围内。 当范围超过0或360时会出现一些问题。你知道吗

如果忽略边界情况,我可以:

import numpy as np
def angleInRange(X,alpha,delta):
    return  (alpha - delta <= X) & (X <= alpha + delta)

如果我用X = np.array([0, 5, 180, 355, 360])测试它,就得到了

>>> print(angleInRange(X,170,30))
[False False  True False False]     # Correct
>>> print(angleInRange(X,10 ,30))
[ True  True False False False]     # 355 and 360 are not selected
>>> print(angleInRange(X,350,30))
[False False False  True  True]     # 0 and 5 are not selected

如果我想得到正确的结果,我需要做如下的事情

def angleInRange(X,alpha,delta):
    test = (   ((alpha       - delta <= X) & (X <= alpha       + delta))
             | ((alpha + 360 - delta <= X) & (X <= 360                ))
             | ((                  0 <= X) & (X <= alpha - 360 + delta))
           )

    return test

由此产生:

>>> print(angleInRange(X,170,30))
[False False  True False False]
>>> print(angleInRange(X,10 ,30))
[ True  True False True True ]
>>> print(angleInRange(X,350,30))
[True True False  True  True]

这是正确的,但是有没有一种更具霸道性、更不麻烦的方法来实现这一点呢?模(%)运算符在这里有帮助吗?你知道吗


Tags: andtestalphanumpyfalsetruereturndef
2条回答

在您的例子中,使用链式比较a < X and X < b变成a < X < b)和逻辑运算符是合乎逻辑的,这两个运算符短路(|&测试左操作数和右操作数,即使最后的结果只有左操作数知道,也要使用orand):

test =   ((alpha       - delta <= X <= alpha       + delta)
         or (alpha + 360 - delta <= X <= 360                )
         or (                  0 <= X <= alpha - 360 + delta))

This postthis other one可能会帮助你。你知道吗

基本上这样你就可以利用模和角的循环性质:

def angleInRange(X, alpha, delta):
    anglediff = (X - alpha + 180 + 360) % 360 - 180
    return (-delta <= anglediff <= delta)

相关问题 更多 >