如何在numpy中实现数组多区间选取?含排除元素、滑动窗口场景
数组排除指定索引+滑动窗口选取高效实现方案
基础需求:排除指定索引取值
针对你给出的测试用例X = [1,2,3,4,5,6,7,8,9,10],需要排除0基索引6、7、8对应的元素,有两种实现方案:
- 原生Python实现(仅适合小数组场景)
用列表推导+集合判断,实现逻辑如下:
执行后返回结果为exclude_idx = {6,7,8} result = [val for idx, val in enumerate(X) if idx not in exclude_idx][1,2,3,4,5,6,10],符合要求。 - 高效向量化实现(适合大数组、结合滑动窗口的场景)
用NumPy的内置操作,所有计算在C层面执行,性能比原生列表推导高1~2个数量级:import numpy as np X_np = np.array(X) exclude_idx = [6,7,8] result = np.delete(X_np, exclude_idx)
结合150大小滑动窗口的实现
你提到的实际场景是总长度200的数组,需要从大小为150的滑动窗口中选取对应元素,直接用NumPy的滑动窗口视图实现,无额外内存拷贝开销,全程无Python层循环,效率最高:
注意:如果是每个窗口需要排除窗口内相对位置为6、7、8的元素,用如下实现
import numpy as np # 生成长度200的测试数组 X_full = np.arange(200) window_size = 150 # 生成滑动窗口视图,直接复用原数组内存,无拷贝 strided_X = np.lib.stride_tricks.sliding_window_view(X_full, window_shape=window_size) # 每个窗口需要排除的相对索引 exclude_in_window = [6,7,8] # 批量过滤所有窗口的指定位置,最终输出形状为(51, 147),对应51个滑动窗口每个窗口剩余147个元素 all_window_result = np.delete(strided_X, exclude_in_window, axis=1)
如果是需要先排除全局索引6、7、8的元素,再切150大小的滑动窗口,调整顺序即可:
# 先过滤全局指定索引 X_filtered = np.delete(X_full, [6,7,8]) # 再生成滑动窗口 strided_filtered = np.lib.stride_tricks.sliding_window_view(X_filtered, window_shape=150)
内容的提问来源于stack exchange,提问作者Amit Kumar
相关产品推荐
相关产品推荐

