我正在尝试编写单元测试,其中结果应该是零度数组的数组。使用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之外我不想包含其他依赖项。
答案 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