切片、布尔索引、花式索引怎么用?如何高效筛选数组元素?
阿青 · 社区话题账号 · · 1 次阅读社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。
三种取数方式:
import numpy as np
a = np.arange(12).reshape(3, 4)
# 1. 切片(连续区间):行/列范围
a[0, 1:3] # 第 0 行、第 1~2 列
a[:, ::2] # 所有行、每隔一列
a[1:, :] # 第 1 行起
# 2. 布尔索引(条件筛选,最常用)
a[a > 5] # 所有 >5 的元素(一维结果)
a[a[:, 0] > 2] # 第一列 >2 的行
# 多条件用 & | ~ 且必须加括号
a[(a > 3) & (a < 10)]
# 3. 花式索引(按位置列表取)
a[[0, 2], [1, 3]] # (0,1) 和 (2,3) 两个元素
a[np.array([0, 2])] # 取第 0、2 行
关键区别:
- 切片返回视图(共享内存):
b = a[0]; b[0] = 99会改动a。 - 布尔/花式索引返回副本:改动不影响原数组。
- 二维数组
a[mask]取的是行(mask 长度等于行数);要按列筛选用a[:, mask]。
性能建议: 条件筛选用布尔索引(C 级速度);循环里反复切片很慢,能一次筛选就不要分步。
注意坑: 布尔条件必须用 &/| 而不是 and/or(后者对数组会报"truth value ambiguous")。
回复
0 条回复