2017-02-24 3 views
1

모든 길이가 다른 CSV 파일이 있습니다. 그러나, 나는 초당 10x 샘플을 가지고있는 진실 파일을 가지고 있지만, 기록되는 데이터는 두 번째 경계에서 초당 한 번 기록됩니다. 이 두 번째 경계를 일치시켜 테스트 자동화에 대한 오류를 비교하려고합니다. 다음은 내 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])과 일치하는 진실 레코드의 인덱스는 데이터 시간이 10 분의 1 초에 정확하게 의존 할 수없는 경우 ind = int(np.round(da_t[i] * 10))입니다. np.isclose(da_t[i], tr_t[ind], reltol, abstol)은 불충분 한 일치를 필터링하는 데 사용될 수 있습니다. 값은 같은 방식으로 비교됩니다.벡터화 형태에서

: tr_t 불규칙하지만 여전히 오름차순이면

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 

하는 인덱스 찾기 :

예 데이터는 측정 포인트 제 모든 정수에 대해 존재하지 않는 것을 제안
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에서 벡터화 된 방식으로 표시됩니다. 또한 시간 데이터의 변형도 허용되었습니다. 정확히 일치하는 경우 대신 measdat[:,None,0]==truthdat[:,0]np.where 안에 사용할 수 있습니다. 이제

>>> 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] 

결과 지표는 우리에게 짝 데이터 포인트를 제공 필요한 경우 다른 후 처리 작업을 수행 할 수 있습니다.