优雅(最有效)的方法来检查角度是否落入圆形置信区间

Max*_*axU 5 python math numpy scipy pandas

我有以下示例数据集:

In [222]: df
Out[222]:
    ci_low  circ_time_angle  ci_high
0       30               30       30
1       10                0       20
2     -188              143      207
3     -188                4      207
4     -188                8      207
5     -188               14      207
6     -188              327      207
7      242               57      474
8      242              283      474
9      242                4      474
10    -190              200       -1
11     -90              300        0
12     -25               15       60
13     -30              349      350
14     420               30      600
15    -100               23      719
16    -100               23      259
17    -350                5      -10
18    -350               11      -10
Run Code Online (Sandbox Code Playgroud)

哪里:

  • ci_low -是循环置信区间(CI)的下限
  • circ_time_angle -是我要检查它是否落入CI的角度
  • ci_high -是循环置信区间(CI)的上限

限制条件:

  • 0 <= circ_time_angle <= 360
  • ci_high >= ci_low
  • ci_lowci_high必然属于[0, 360](见行[2-18]的样本数据集)。

问:这将是优雅的方式来检查角度是否circ_time_angle落入圆形的置信区间[ci_low, ci_high]?还是我需要单独检查所有边缘情况?

所需/结果数据集:

In [224]: res
Out[224]:
    ci_low  circ_time_angle  ci_high  falls_into_CI
0       30               30       30           True
1       10                0       20          False
2     -188              143      207           True
3     -188                4      207           True
4     -188                8      207           True
5     -188               14      207           True
6     -188              327      207           True
7      242               57      474           True
8      242              283      474           True
9      242                4      474           True
10    -190              200       -1           True
11     -90              300        0           True
12     -25               15       60           True
13     -30              349      350           True
14     420               30      600          False
15    -100               23      719           True
16    -100               23      259           True
17    -350                5      -10          False
18    -350               11      -10           True
Run Code Online (Sandbox Code Playgroud)

我还尝试将CI边界[0, 360]与转换为[-180, 180],但仍然无法帮我找到一个优雅的公式。


样本数据集设置:

In [222]: df
Out[222]:
    ci_low  circ_time_angle  ci_high
0       30               30       30
1       10                0       20
2     -188              143      207
3     -188                4      207
4     -188                8      207
5     -188               14      207
6     -188              327      207
7      242               57      474
8      242              283      474
9      242                4      474
10    -190              200       -1
11     -90              300        0
12     -25               15       60
13     -30              349      350
14     420               30      600
15    -100               23      719
16    -100               23      259
17    -350                5      -10
18    -350               11      -10
Run Code Online (Sandbox Code Playgroud)

Max*_*axU 1

目前我提出了以下想法:

  1. 检查那些覆盖 360+ 度的 CI 间隔并将结果设置True为相应的行
  2. 对于所有其他行,以相同的方式旋转所有角度(列:)并比较旋转['ci_low', 'circ_time_angle', 'ci_high']ci_low == 0 circ_time_angle % 360 <= ci_high % 360

代码:

def angle_falls_into_interval(angle, lower, upper, high=360):
    # rotate ALL angles in the way, 
    # so that the lower angle = 0 degrees / radians.
    lower = np.asarray(lower)
    angle = np.asarray(angle) - lower
    upper = np.asarray(upper) - lower
    lower -= lower
    return np.where(upper-lower >= high, 
                    True, 
                    (angle % high) <= (upper % high))
Run Code Online (Sandbox Code Playgroud)

查看:

In [232]: res = df.assign(falls_into_CI=angle_falls_into_interval(df.circ_time_angle, 
                                                                  df.ci_low, 
                                                                  df.ci_high,
                                                                  high=360))

In [233]: res
Out[233]:
    ci_low  circ_time_angle  ci_high  falls_into_CI
0       30               30       30           True
1       10                0       20          False
2     -188              143      207           True
3     -188                4      207           True
4     -188                8      207           True
5     -188               14      207           True
6     -188              327      207           True
7      242               57      474           True
8      242              283      474           True
9      242                4      474           True
10    -190              200       -1           True
11     -90              300        0           True
12     -25               15       60           True
13     -30              349      350           True
14     420               30      600          False
15    -100               23      719           True
16    -100               23      259           True
17    -350                5      -10          False
18    -350               11      -10           True
Run Code Online (Sandbox Code Playgroud)