假设我有一些包含特定事件的数据,我想测量事件之间的时间。但有时我会有nan值,因为没有测量。我不想包括这些时间间隔,因为我真的不知道那里发生了什么。你知道吗
例如,给定:
import numpy as np
a = np.array([0, 1, 0, 0, 0, 1, 0, 0, np.nan, np.nan, 1, 0, 0, 0, 0, 1])
我想回到[4, 5]
,因为第一组索引之间的间隔是4个索引,第二组索引之间的间隔是nan,因此被忽略,第三组和第四组索引之间的间隔是5个索引。[4, nan, 5]
也可以作为输出。你知道吗
我可以做到以下几点:
a_mod = a.copy()
a_mod[np.isnan(a)] = -1e9 # some value I know is larger than my interval will ever be
a_sum = np.cumsum(a_mod)
a_sum_pts = a_sum[a == 1]
mask = np.diff(a_sum_pts) > 0
events = np.where(a == 1)[0]
intervals = np.diff(events)
good_intervals = intervals[mask]
这确实给了我想要的答案。但这感觉像一个可怕的黑客。有更好的方法吗?也许熊猫身上有什么?你知道吗
试着简单一点
这只是查找1的位置和
nan
的位置,然后删除包含nan
的间隔。你知道吗searchsorted
上的-1
说明了np.diff
的移位;作为一个小警告,如果在第一个1
之前有nan
,则此代码不能正常工作(尽管这很容易纠正)。你知道吗您可以使用^{} 找出哪些片段包含nan,并将其屏蔽:
这将线性执行,即
O(n)
。你知道吗相关问题 更多 >
编程相关推荐