问题
我有一些浮点数组,需要在其中标识值冻结的索引,数组在一段时间内具有相同值的索引。
例
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
y1
和y2
看起来像这样:我想知道这些水平线在哪里。
我试过了
环:
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/