我想检查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和更少的麻烦的方式来实现这一目标?模(%)运算符可以在这里帮助吗?
答案 0 :(得分:0)
在您的情况下,使用链式比较(a < X and X < b
变成a < X < b
)和逻辑运算符会短路({{ 1}}和|
会同时测试左右操作数,即使最终结果仅通过左操作数知道,也应使用&
和or
):
and
答案 1 :(得分:-1)
This post或this other one可能会帮助您。
基本上,您可以使用模数和角度为循环的属性
def angleInRange(X, alpha, delta):
anglediff = (X - alpha + 180 + 360) % 360 - 180
return (-delta <= anglediff <= delta)