使用numpy比较和查找两个不同大小的数组之间的错误

时间:2017-02-24 22:48:36

标签: python arrays python-2.7 numpy vectorization

我的csv文件长度各不相同。但是,我有一个真实文件,其采样速率为每秒10次,但正在记录的数据在第二个边界上每秒记录一次。我试图匹配这些第二个边界来比较自动化测试的错误。下面是我的csv文件的示例。

真实档案

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

测量文件

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

我为每个数据拉取了真实文件的数据集以获取我的测量结果,我正在尝试进行快速比较以查看与测量文件中的数据值相关联的时间值是否在真值文件中相同时间值之间的错误。我是如何在数组中搜索其中一个值是否相等而不必在每次采样数据更改时都使用for循环来搜索数组?

2 个答案:

答案 0 :(得分: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]

并根据需要继续进行任何其他后期处理。

答案 1 :(得分:0)

更新

假设:

  • 数据和真值以四个数组tr_t(真值时间)tr_v(真值)da_t(数据时间)和da_v(数据值)
  • 真实数据完整并以10 Hz采样,换句话说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]