2014-11-03 19 views
0

我想写一个单元测试,其结果应该是一个零度数组的数组。使用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

这不是一个包的情况下我保持,所以我不想包括除了宇宙和numpy之外的其他依赖。

回答

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]) 
+0

当数值非常接近360但刚好在下时不起作用。我删除了单元测试标签,虽然我没有看到何时使用它的指南 – sargas 2014-11-03 21:46:23

+0

@sargas查看编辑答案 – 2014-11-03 22:02:57

1

鉴于所有你想测试接近圆周上的数字是在ndarray名为a,然后

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

或甚至更简单,

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

是你所需要的(注意,180的确是很随意的,它只是你必须移动比较远离0又名360

编辑

我已经删除,因为的我的回答瑕疵,这在ev-br的评论中显示给我,但后来我改变了主意,因为(谢谢你)我看到了灯光。

一个想要测试如果一个圆上,通过在度的角度确定的一个点,接近由角度0标识的点。首先,圆周上的距离D(0,theta)等于D(0,-theta),因此我们可以比较角度的绝对值。

我上面提出的测试是有效的,或者至少我认为是这样,对于任何正数值theta

如果我使用的角度的绝对值上面的测试进行测试,一切 应该没问题,不应该吗?以下是一些测试

In [1]: import numpy as np 

In [2]: a = np.array([0, 1e-5,-1e-7,360.1,-360.1,359.9,-359.9,3600.1,-3600.1,3599.9,-3599.9]) 

In [3]: np.allclose(np.mod(np.abs(a)+180, 360), 180, atol=0.2) 
Out[3]: True 

In [4]: 
+0

尝试'np.fmod(-359 + 180,360)' – 2014-11-03 22:08:00

+0

Mh,我会关闭我的回答... – gboffi 2014-11-03 22:14:18

+0

@ ev-br正如你所看到的,我改变了主意。感谢您的评论,这很有启发。非常感谢你。 – gboffi 2014-11-03 22:52:06