大佬教程收集整理的这篇文章主要介绍了在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,请注明来意。