选择范围内的角度

时间:2018-10-31 12:06:26

标签: python numpy

我想检查numpy阵列中的哪些角度在给定的alpha +/-增量之内。 范围超过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]

这是正确的,但是有没有更多的pythonic和更少的麻烦的方式来实现这一目标?模(%)运算符可以在这里帮助吗?

2 个答案:

答案 0 :(得分:0)

在您的情况下,使用链式比较a < X and X < b变成a < X < b)和逻辑运算符会短路({{ 1}}和|会同时测试左右操作数,即使最终结果仅通过左操作数知道,也应使用&or):

and

答案 1 :(得分:-1)

This postthis other one可能会帮助您。

基本上,您可以使用模数和角度为循环的属性

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