You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:06:02