如何用Numpy/Scipy实现数组降长重采样(取区间最大值)
用Numpy高效实现数组区间最大值聚合(音频信号场景)
你需要将长Numpy数组按固定区间分割,每个区间取最大值生成短数组,替代当前的循环实现。这里有两种更高效的向量化实现方式:
方式一:舍去最后不足一个区间的元素(与原代码逻辑一致)
直接截取数组到能被区间长度整除的部分,再通过reshape和max完成聚合:
import numpy as np # 示例数组,长度510 a = np.random.rand(510) shorten_length = 50 # 计算有效长度,舍去末尾不足一个区间的部分 valid_len = (len(a) // shorten_length) * shorten_length a_shortened = a[:valid_len].reshape(-1, shorten_length).max(axis=1)
这种方式完全匹配你原代码的逻辑,且依赖Numpy的向量化操作,比Python循环效率高得多,尤其适合音频这类大数据量场景。
方式二:保留末尾不足区间的元素
如果不想丢弃最后一段不足shorten_length的元素,可先补零凑整再聚合:
import numpy as np a = np.random.rand(510) shorten_length = 50 # 计算需要补零的长度,确保总长度能被区间长度整除 pad_len = (shorten_length - len(a) % shorten_length) % shorten_length a_padded = np.pad(a, (0, pad_len), mode='constant') a_shortened = a_padded.reshape(-1, shorten_length).max(axis=1)
最终得到的数组长度为ceil(510/50)=11,最后一个元素是原数组末尾10个元素的最大值。
内容的提问来源于stack exchange,提问作者escapecharacter
相关产品推荐
相关产品推荐

