![](/img/trans.png)
[英]How to replace the first dimension of a 3D numpy array with values from a 1D array?
[英]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.])
这很容易通过使用while
或for
循环在数组上循环来实现。 然而,由于这是一个在线应用程序,我一直在 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.