2014-11-03 23 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