在删除容易出错的值时避免python循环

2024-10-01 05:04:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我的时间线存储在简单的numpy数组中,它们很长(>;1000万个条目)

我必须检测到机器的停机,它显示在时间向量的跳跃中。关机后,我想删除接下来的10个值(传感器确实会在开机后一段时间内产生不好的结果)并继续。你知道吗

我想出了以下代码:

Keep_data=np.empty_like(Timestamp_new,dtype=np.bool)                                
Keep_data[0]=False
Keep_data[1:]=Timestamp_new[1:]>(Timestamp_new[:-1]+min_shutdown_length)

for item in np.nonzero(np.logical_not(Keep_data))[0]:
    Keep_data[item:min(item+10,len(Keep_data)]=False

Timestampnew=Timestampnew[Keep_data]

如果没有纯python循环,有人能推荐一个更有效的代码吗?你知道吗

谢谢你。你知道吗


Tags: 代码gtnumpyfalsenewdatanp时间
1条回答
网友
1楼 · 发布于 2024-10-01 05:04:01

基本上,您正在尝试扩展/扩大或在图像处理方面^{}区域False。同样,我们有一个内置的as^{}。现在,您正试图使它从输入数组False中的每个这样的Keep_data元素开始向更高的索引增长。因此,我们需要使用不同的偏移量(或者scipy称之为:origin),而不是默认的0,否则每个元素的两端都会扩展。你知道吗

因此,总而言之,一个用它来摆脱代码中循环部分的实现,我们会有这样一个实现-

N = 10   # Interval length
dilated_mask = binary_dilation(~Keep_data, structure=np.ones(N),origin=-int(N/2))
Keep_data[dilated_mask] = False

另一种方法更接近于问题中作为循环代码发布的方法,但是用^{}矢量化,看起来像这样-

N = 10   # Interval length
idx = np.nonzero(np.logical_not(Keep_data[:-N]))[0]
Keep_datac[(idx + np.arange(N)[:,None]).ravel()] = False
rest = np.nonzero(np.logical_not(Keep_data[-N:]))[0]
if len(rest)>0:
    Keep_datac[-N+rest[0]:] = False

相关问题 更多 >