【问题标题】:comparing and finding error between two arrays of different sizes using numpy使用 numpy 比较和查找两个不同大小的数组之间的错误
【发布时间】:2017-07-15 22:21:57
【问题描述】:

我有长度各不相同的 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 循环搜索数组?

【问题讨论】:

    标签: python arrays python-2.7 numpy vectorization


    【解决方案1】:

    更新:

    假设:

    • 数据和真值在四个数组中给出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]
    

    【讨论】:

    • 示例数据表明测量点并不是每一个整数秒都存在,因此需要一个重要的data_timestamps
    • @AndrasDeak 完成真实时间就足够了。这些以暗示它们的方式表示。 truth_data[data_timestamps] 然后选择正确的参考值来匹配数据。简单示例:抽取真值乘以 0,1,2,3,... 数据时间戳 0,1,3 然后将选择位置 0,1,3 的抽取真相数据,这是正确的。请注意,Q 明确指出数据时间是整秒。最后,我确实非常肤浅地提到了如何解决真实时间不规则和不完整的情况。
    • @PaulPanzer 这会很好,但我有另一个数据集,我将比较它也将每秒记录 10 次,这意味着我不能丢弃这些真值。我正在寻找一种方法来同时将测量数据文件中的位置与相应的真值进行比较。我的其他数据文件以这种更快的速度记录,不能简单地使用增量进行比较,因为由于软件缺陷,它会及时跳过。
    • @nichollsg 只要您的真实文件不跳过任何时间,并且如果您的数据时间在十分之一秒内,它仍然可以工作。只需将时间戳乘以 10,四舍五入,转换为 int 并将它们用作完整真值数组的索引。
    【解决方案2】:

    如果您的真值文件和测量文件包含足够接近的时间点,您可以使用这些时间点配对您的数据:

    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]
    

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

    【讨论】:

      猜你喜欢
      • 2022-01-11
      • 1970-01-01
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      相关资源
      最近更新 更多