如何测试角度量的接近程度

时间:2014-11-03 20:58:53

标签: python numpy

我正在尝试编写单元测试,其中结果应该是零度数组的数组。使用np.assert_allclose会导致以下失败:

E                   AssertionError: 
E                   Not equal to tolerance rtol=1e-07, atol=0.000277778
E                   
E                   (mismatch 100.0%)
E                    x: array([[  3.600000e+02],
E                          [  3.155310e-10]])
E                    y: array([[0],
E                          [0]])

明显发生的是代码正在运行([[360], [3e-10]]足够接近[[0], [0]]我的角度数量),但np.assert_allclose没有意识到0≅360。

有没有办法使用numpy的测试框架进行比较,我不在乎这些值是否超过360的倍数?

在这种特殊情况下,使用np.set_printoptions(precision=30)打印数组的第一个元素会给我359.999999999823955931788077577949,所以这不是一个可以归一化到0到360之间的情况。

这不是我维护的包,所以除了astropy和numpy之外我不想包含其他依赖项。

2 个答案:

答案 0 :(得分:1)

(编辑回答,以前的版本错了)

使用例如这可以将您的值降低到所需的范围:

>>> def _h(x, a):
...    xx = np.mod(x, a)
...    return np.minimum(xx, np.abs(a - xx))

然后

>>> xx = np.asarray([1, -1, 359, 361, 360*3+1, -8*360 + 2])
>>> _h(xx, 360)
array([1, 1, 1, 1, 1, 2])

答案 1 :(得分:1)

鉴于您想要测试圈子上的亲密度的所有数字都在名为ndarray的{​​{1}}中,那么

a

或者,甚至更简单,

np.allclose(np.fmod(a+180, 360)-180,0, atol=mytol)

就是你所需要的(注意np.allclose(np.fmod(a+180, 360),180, atol=mytol) 确实是非常随意的,只是你必须将比较从180又名0移开

修改

我因为一个缺陷而删除了我的答案,ev-br在评论中向我显示了该答案,但后来我改变了主意,因为(谢谢你)我看到了光。

人们想要测试圆上由角度(以度为单位)标识的点是否接近由角度360标识的点。首先,圆周上的距离0等于D(0,theta),因此我们可以比较角度的绝对值。

我上面提出的测试对于D(0,-theta)的任何正值都是有效的,或者至少我是这么认为的。

如果我对要测试的角度的绝对值使用上述测试,那就是一切 应该没问题,不应该吗?接下来是一些测试

theta