2017-02-24 25 views
1

我有csv文件,它們的長度都不相同。但是,我有一個真實文件,其採樣速度爲每秒10次,但正在記錄的數據在第二個邊界上每秒記錄一次。我試圖匹配這些第二個邊界來比較自動化測試的錯誤。以下是我的csv文件的樣子。使用numpy比較和查找兩個不同大小的數組之間的錯誤

真相文件

0, 1 
0.1, 2 
0.2, 3 
. 
. 
. 
x, n 

測量文件

0, 1.01 
1, 9.99 
3, 30.05 
. 
. 
. 
x, n 

我拉在數據集上的每個數據拉我的測量結果的真相文件,我試圖做一個簡單比較查看與測量文件中的數據值相關聯的時間值是否在真值文件中的相同時間值之間的誤差範圍內。我究竟能夠通過數組搜索一個值是否等價,而不必每次使用for循環搜索數據時都要對數據進行採樣?

回答

0

更新:

假設:

  • 數據和真相在四個陣列tr_t(真理次)tr_v(真值)da_t(數據次)和da_v(數據值)
  • 給出真實數據是完整的並且以10Hz採樣,換句話說tr_t = np.arange(N)/10

在這些假設下,如果不能依賴數據時間恰好落在十分之幾秒內,則匹配給定數據樣本(da_t[i], da_v[i])的真值記錄的索引是ind = int(np.round(da_t[i] * 10))np.isclose(da_t[i], tr_t[ind], reltol, abstol)可用於過濾不足的匹配。數值以相同的方式進行比較。

在向量化形式:

inds = np.round(10 * da_t).astype(int) 
mask = np.isclose(da_v, tr_v[inds], reltol, abstol) \ # required 
     & np.isclose(da_t, tr_t[inds], reltol, abstol) # optional 

查找索引如果tr_t是不規則的,但仍然以升序:

inds = np.searchsorted(tr_t, da_t) 
inds += tr_t[(inds + 1) % len(tr_t)] - da_t > da_t - tr_t[inds] 
+0

示例性數據表明,測量點中不存在對於每個整數第二,所以需要一個不重要的'data_timestamps'。 –

+0

@AndrasDeak完成真相就足夠了。這些代表的方式表明他們是。然後,'truth_data [data_timestamps]'選擇正確的參考值以匹配數據。簡單的例子:抽取的真值時間0,1,2,3,...數據時間戳0,1,3然後在位置0,1,3抽取真值數據將被選中,這是正確的。請注意,Q清楚地表明數據時間爲滿秒。最後,我確實非常表面地提到,如何處理真理時間不規律和完整的情況。 –

+0

@PaulPanzer這將是一個很好的例外,我有另一個數據集,我將比較這也將記錄每秒10次,這意味着我不能放棄這些真值。我正在尋找一種方法來將我測量的數據文件中的位置與相應的真值進行比較。我的其他數據文件以更快的速度記錄,不能簡單地使用增量進行比較,因爲它由於軟件缺陷而及時跳過。 – nichollsg

1

如果你的真理文件,測量文件包含了足夠接近,你可以用這些時間點配對您的數據的時間點:

import numpy as np 

# set up dummy data 
truthdat = np.arange(25)[:,None]*[0.1,1] 
measdat = np.array([[0.01, 0.01], [0.99, 9.99], [2.01,20.05]]) 

# find the temporal indices which correspond to one another 
i_meas,i_truth = np.where(np.isclose(measdat[:,None,0],truthdat[:,0],atol=0.05)) 

我們所做的是利用數組廣播,使我們能夠比較每次在measdat中,每次以truthdat以矢量化的方式。另外請注意,我允許在時間數據上也有一些變化。如果這些完全相同,則可以在np.where內部使用measdat[:,None,0]==truthdat[:,0]

產生的指標給我們配對的數據點:

>>> measdat[i_meas] 
array([[ 1.00000000e-02, 1.00000000e-02], 
     [ 9.90000000e-01, 9.99000000e+00], 
     [ 2.01000000e+00, 2.00500000e+01]]) 

>>> truthdat[i_truth] 
array([[ 0., 0.], 
     [ 1., 10.], 
     [ 2., 20.]]) 

現在你同樣可以使用np.isclose與您所選擇的耐受性比較這些數據對第二欄:

# tell if all values are within atol=0.05 absolute error 
are_close = np.allclose(measdat[i_meas,1],truthdat[i_truth,1],atol=0.05) 

# compute the error for each measured point 
abserrors = measdat[i_meas,1] - truthdat[i_truth,1] 

並根據需要進行任何其他後期處理。

相關問題