繁体   English   中英

如何有效地替换一维数组中相同的连续值

[英]How to replace identical consecutive values from a 1D array efficiently

令人惊讶的是,经过相当多的研究,我没有发现任何帖子引发了解决这个简单问题的好主意。

我有一个形状为(n, )的一维numpy数组,它大部分是零和一些其他正值。

D = np.zeros(10)
D[2] = 1
D[5] = 4
D[7] = 3

Out: array([0., 0., 1., 0., 0., 4., 0., 3., 0., 0.])

但是,有时,其中一个值(它是给定样本的触发器)可能会在下一个(或几个下一个样本)期间重复。

D = np.zeros(10)
D[2] = 1
D[3] = 1
D[5] = 4
D[7] = 3

Out: array([0., 0., 1., 1., 0., 4., 0., 3., 0., 0.])

在这种情况下,我想处理数组以用 0 替换相同的连续值; 在这种情况下,将第二个1替换为0

In: array([0., 0., 1., 1., 0., 4., 0., 3., 0., 0.])
Out: array([0., 0., 1., 0., 0., 4., 0., 3., 0., 0.])

对于一个额外的复杂度级别,我想定义一个容差,如果值x>0之后的每个元素都足够接近x ,那么它们将被 0 替换。

In: array([0., 0., 1., 0.98, 1.01, 4., 0., 3., 3.1, 0.]), tolerance = 0.05
Out: array([0., 0., 1., 0., 0., 4., 0., 3., 3.1, 0.])

这很容易通过使用whilefor循环在数组上循环来实现。 然而,由于这是一个在线应用程序,我一直在 numpy 中寻找矢量化解决方案。 如果有人有任何建议,任何 function 我可以考虑尽可能高效地执行此操作,请发表评论!

尝试像这样使用np.diff()

D[np.where(np.diff(D)==0)] = 0

编辑:包括OP的解决方案,包括公差和前置:

D[np.where(np.diff(D, prepend=[0])<=tolerance)] = 0

编辑 2:@obchardon 删除不必要的np.where的极好建议:

D[abs(np.diff(D, prepend=[0]))<=tolerance] = 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM