程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在numpy数组中查找和删除连续的重复间隔大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决在numpy数组中查找和删除连续的重复间隔?

开发过程中遇到在numpy数组中查找和删除连续的重复间隔的问题如何解决?下面主要结合日常开发的经验,给出你关于在numpy数组中查找和删除连续的重复间隔的解决方法建议,希望对你解决在numpy数组中查找和删除连续的重复间隔有所启发或帮助;

问题: 我需要找到容差范围内的重复值,并将它们替换为 NaN。我在下面粘贴的函数可以做到这一点,但它本质上是 O(n^2) 时间,我(几乎)确定这可以在 O(n) 时间内完成。一个典型的数组有 > 500k 个样本,因此运行时间很重要。

它应该做什么:例如,如果您有一个数组,例如 [1,2,3,1,3] 并且公差 = 0,那么您将返回: [1,nan,3]
如果您的公差 = 0.1 并且数组为 [1,2.95,3.05,3],您也会返回 [1,3]

运行缓慢的示例

def find_and_remove_runs(data,n_repeats,tol):
    indices_to_null = []
    for i in range(len(data)-n_repeats):
        diff = abs(data[(i+1):] - data[i])
        end_point = np.argwhere(diff > tol)[0] + 1
        if end_point >= n_repeats:
            indices_to_null.append(tuple((i,int(end_point))))

    if len(indices_to_null) > 0:
        for i in range(len(indices_to_null)):
            data[indices_to_null[i][0]:(
                indices_to_null[i][0] + indices_to_null[i][1])] = np.nan

对于那些感兴趣的人,这是来自移动传感器的数据......传感器不时卡住导致重复测量。即使测量相同的点,传感器也会有一些差异,因此需要重复公差。

解决方法

清除源数组元素的规则可以表示 作为 2 个条件的逻辑 OR

  • 前一个元素(如果存在)靠近当前元素,
  • 下一个元素(如果存在)接近当前元素。

"Is close to" 表示来自两者之间的差值的绝对值 两个元素都小于或等于容差 (tol)。

为了提供一个更有启发性的例子,我定义了源数组 它在两端也包含“关闭”元素的序列:

data = np.array([1,1,2,2.95,3,3.05,3])

要获得预期的结果,请定义以下函数:

def clearRuns(data,tol):
    isNextSame = np.abs(np.diff(data,prepend=np.nan))       <= tol
    isPrevSame = np.abs(np.diff(data[::-1],prepend=np.nan))[::-1] <= tol
    indToClear = np.logical_or(isNextSame,isPrevSame)
    return np.where(indToClear,np.nan,data)

然后运行它:

result = clearRuns(data,0.05)

结果是:

array([nan,nan,2.,1.,nan])

它应该比您的解决方案运行快得多

大佬总结

以上是大佬教程为你收集整理的在numpy数组中查找和删除连续的重复间隔全部内容,希望文章能够帮你解决在numpy数组中查找和删除连续的重复间隔所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: