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

如何用索引快速选取二维NumPy数组子数组的非第三个元素?

二维NumPy数组移除每第三个元素的高效索引方法

给定如下二维NumPy数组:

import numpy as np

array = np.array([[1, 1, 4, 2, 1, 8],
                  [1, 1, 8, 2, 1, 16],
                  [1, 1, 40, 2, 1, 80],
                  [1, 2, 40, 2, 1, 80]])

需要移除每个子数组中的每第三个元素,得到结果:

[[1 1 2 1]
 [1 1 2 1]
 [1 1 2 1]
 [1 2 2 1]]

以下是两种无需循环和np.concatenate的高效实现方法,均基于NumPy原生向量化操作,适合处理大维度数组:

方法一:布尔掩码索引

通过生成重复的布尔掩码,直接筛选保留的元素:

# 生成掩码:每3个元素保留前两个,重复至子数组长度
mask = np.tile([True, True, False], array.shape[1] // 3)
result = array[:, mask]

方法二:Reshape + 切片(更高效)

利用数组形状变换,直接提取每个3元素块的前两个元素:

# 将每行重塑为(块数, 3),取前两列后再展平回原行数
result = array.reshape(array.shape[0], -1, 3)[:, :, :2].reshape(array.shape[0], -1)

效率说明

两种方法均为向量化操作,无Python级循环:

  • 方法二的reshape在数组内存连续时为视图操作(仅修改数组元数据,不复制内存),切片也直接操作底层数据,整体性能更优,尤其适合超大第一维度的数组。
  • 方法一的掩码生成和索引也足够高效,代码可读性更强。

内容的提问来源于stack exchange,提问作者Edy Bourne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:52:34