将索引添加到 numpy 中索引值周围的索引列表

Add indexes to index list around index value in numpy

我有以下数组:

time = [1e-6, 2e-6, 3e-6, 4e-6, 5e-6, 6e-6, 7e-6, 8e-6, 9e-6, 10e-6]
signal = [0, 10, 3, 2, 1, 0, 10, 2, 2, 5]

并且我想(从两个数组中)删除任何高于阈值的数据点,具有给定的填充宽度

threshold = 9
padding = 3e-6

因此,signal 数组中大于 9 或 time 数组中 100 个数据点内的任何索引都应从两个数组中删除。注意:这意味着如果 padding window 中有两个数据点在 threshold

之上,则可能存在重叠

示例输出

time_out = [4e-6, 5e-6, 9e-6, 10e-6]
signal_out = [2, 1, 2, 5]

编辑:这个 post 非常相似,但是它只对数组的一个索引执行,我需要在多个索引上执行它(上面例如 time=2e-6 和 time=7e -6)

让我们试试这个。这个想法是创建一个布尔掩码,如果每个 paddingsignal 超出 threshold 范围,则 returns 为真。我把padding除以3,因为IIUC,一个padding是一个大小为3的window,所以我们只需要考虑大于[=的signals 14=] 及其 2 个相邻值。

time_arr = np.array(time)
signal_arr = np.array(signal)

llim = time_arr[signal_arr>threshold, None] - padding/3
ulim = time_arr[signal_arr>threshold, None] + padding/3

msk = ((llim > time_arr) | (ulim< time_arr)).all(axis=0)
time_out = time_arr[msk]
signal_out = signal_arr[msk]

另一种选择是使用 numpy.roll 获取相邻值以创建布尔掩码:

comp = signal_arr<=threshold
msk = np.roll(comp, 1) & comp & np.roll(comp, -1)
time_out = time_arr[msk]
signal_out = signal_arr[msk]

输出:

array([4.e-06, 5.e-06, 9.e-06, 1.e-05])
array([2, 1, 2, 5])