提取数值高于阈值的numpy数组的子数组

2024-09-27 02:17:03 发布

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

我有一个声音信号,作为一个numpy数组导入,我想把它切成块numpy数组。但是,我希望块只包含超过阈值的元素。例如:

threshold = 3
signal = [1,2,6,7,8,1,1,2,5,6,7]

应该输出两个数组

^{pr2}$

好吧,以上是清单,但你明白我的意思。在

这是我迄今为止所做的,但这只会毁了我的公羊

def slice_raw_audio(audio_signal, threshold=5000):

    signal_slice, chunks = [], []

    for idx in range(0, audio_signal.shape[0], 1000):
        while audio_signal[idx] > threshold:
            signal_slice.append(audio_signal[idx])
         chunks.append(signal_slice)
    return chunks

Tags: numpy声音元素thresholdsignal信号slice阈值
3条回答

这是一种数字方法:

In [115]: np.split(signal, np.where(np.diff(signal > threshold))[0] + 1)
Out[115]: [array([1, 2]), array([6, 7, 8]), array([1, 1, 2]), array([5, 6, 7])]

请注意,这将为您提供基于拆分逻辑(基于diff和continues项)的所有上下项目始终是交错的,这意味着您可以简单地通过索引将它们分开:

^{pr2}$

您可以将列表的第一项与threshold进行比较,以找出上面哪一个部分会给出上面的项目。在

通常,您可以使用以下代码段获取上面的项目:

np.split(signal, np.where(np.diff(signal > threshold))[0] + 1)[signal[0] < threshold::2]

这里有一个选择:

above_th = signal > threshold
index, values = np.arange(signal.size)[above_th], signal[above_th]
np.split(values, np.where(np.diff(index) > 1)[0]+1)
# [array([6, 7, 8]), array([5, 6, 7])]

在函数中换行:

^{pr2}$

有一种方法-

def split_above_threshold(signal, threshold):
    mask = np.concatenate(([False], signal > threshold, [False] ))
    idx = np.flatnonzero(mask[1:] != mask[:-1])
    return [signal[idx[i]:idx[i+1]] for i in range(0,len(idx),2)]

样本运行-

^{pr2}$

运行时测试

其他方法-

# @Psidom's soln
def arange_diff(signal, threshold):
    above_th = signal > threshold
    index, values = np.arange(signal.size)[above_th], signal[above_th]
    return np.split(values, np.where(np.diff(index) > 1)[0]+1)

# @Kasramvd's soln   
def split_diff_step(signal, threshold):   
    return np.split(signal, np.where(np.diff(signal > threshold))[0] + 1)[1::2]

时间安排-

In [67]: signal = np.random.randint(0,9,(100000))

In [68]: threshold = 3

# @Kasramvd's soln 
In [69]: %timeit split_diff_step(signal, threshold)
10 loops, best of 3: 39.8 ms per loop

# @Psidom's soln
In [70]: %timeit arange_diff(signal, threshold)
10 loops, best of 3: 20.5 ms per loop

In [71]: %timeit split_above_threshold(signal, threshold)
100 loops, best of 3: 8.22 ms per loop

相关问题 更多 >

    热门问题