问题

我有一些浮点数组,需要在其中标识值冻结的索引,数组在一段时间内具有相同值的索引。



x = np.linspace( 0, 30, 1000 )
y1 = np.sin( x )
y2 = np.sin( x )
# Introduce some errors!
y2[ (x>5)&(x<=8) ] = -0.2
y2[ (x>15)&(x<=16) ] = -1
y2[ (x>16)&(x<17) ] = 1


y1y2看起来像这样:

python - 如何在连续信号中查找无效值?-LMLPHP

我想知道这些水平线在哪里。



我试过了


环:

error = np.zeros_like( y2 )
for i in range(1,y2.shape[-1]-1):
    if y2[i-1] == y2[i] == y2[i+1]:
        error[i-1] = 1
        error[i] = 1
        error[i+1] = 1



当然,我可以在for之前定义窗口长度。但是,一旦我有几个嵌套的循环(针对不同的列和周期),它就会显得笨拙。


np.diff→这里的问题是,有时导数本身为0。同样,信号变化非常缓慢(温度)是很常见的,所以我最终再次在循环中检查相邻(零)值。
我开始寻找一些索引,例如:y2[ where(y2==previous(y2) & y2 == next(y2) ],但是到目前为止还没有成功。这就是我现在尝试的pandas.DataFrame


我想使用水平线出现的索引,或者用np.nan替换它们。我还需要能够播放一些窗口宽度(最后很可能在10个值左右)。

有任何想法吗?



语境

我真正拥有的是一个带有温度测量值的pandas.DataFrame,在其中我得到浮点值以及记录时间的时间戳。有时错误似乎“冻结”,并给出一条直线而不是测量值。有时是重复的最后一次测量,有时只是一个随机值。我需要知道每个传感器何时发生故障。当然,每次的故障持续时间都是不同的。每个信号的长度约为30,000个元素。



使用:python 3.5.2 numpy 1.11.1 pandas 0.18.1

最佳答案

你不能做这样的事情吗

dy2 = np.r_[1, np.diff(y2).astype(bool).astype(int), 1]
bnds = np.diff(dy2)
starts = np.where(bnds == -1)[0]
stops = np.where(bnds == 1)[0] + 1
keep = stops >= starts + min_length
starts = starts[keep]
stops = stops[keep]

关于python - 如何在连续信号中查找无效值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41962819/

10-12 22:04