Выберите угол в диапазоне - PullRequest
0 голосов
/ 31 октября 2018

Я хотел бы проверить, какие углы в массиве numpy находятся в пределах заданной альфа +/- дельты. Некоторые проблемы возникают, когда диапазон пересекает 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]

Это правильно, но есть ли более питонический и менее громоздкий способ добиться этого? Может ли оператор по модулю (%) помочь здесь?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Этот пост или этот другой , вероятно, поможет вам.

В основном, таким образом вы используете свойство по модулю и углам циклически:

def angleInRange(X, alpha, delta):
    anglediff = (X - alpha + 180 + 360) % 360 - 180
    return (-delta <= anglediff <= delta)
0 голосов
/ 31 октября 2018

В вашем случае логично использовать цепные сравнения (a < X and X < b становится a < X < b) и логические операторы , которые закорачивают (| и & тест) оба левых и правых операнда, даже если конечный результат известен только с левым операндом, вместо этого используйте or и and):

test =   ((alpha       - delta <= X <= alpha       + delta)
         or (alpha + 360 - delta <= X <= 360                )
         or (                  0 <= X <= alpha - 360 + delta))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...