Skip to main content

花式索引(Fancy Indexing)

传入一个索引列表,按任意顺序选出元素——这在 Python 原生列表中是不支持的。


一维花式索引

a = np.arange(20)

# 按指定顺序选取
indices = [1, 3, 4, 6, 7]
a[indices] # [1 3 4 6 7]

# 更实用的例子:排序
a = np.random.randint(0, 100, 20)
order = np.argsort(a) # 排序后的索引顺序
a[order] # 相当于 a 的排序结果

Python 列表不支持 [1, 3, 5] 式的索引——这是 NumPy 独有的功能。


二维数组的花式索引

a = np.arange(20).reshape(4, 5)

# 选出第 1 行和第 3 行
a[[1, 3]] # 等价于 a[[1, 3], :]

行和列都用花式索引(注意陷阱!)

a = np.arange(20).reshape(4, 5)

# ❌ 这样写不会得到 "第1/3行 × 第1/3列" 的4个值
a[[1, 3], [1, 3]] # 返回 [6, 18] —— 是 (1,1) 和 (3,3) 两个点!

# ✅ 要取4个值,需要分步操作:
a[[1, 3], :][:, [1, 3]] # 先选行,再选列

两边同时用花式索引时,NumPy 把它理解为配对选取而非笛卡尔积。这是初学者最容易踩的坑。


四种索引方式总结

a = np.arange(20).reshape(4, 5)

# 普通索引 a[0, 0]
# 切片 a[0:2, 1:3]
# 布尔索引 a[:, a[0] > 2]
# 花式索引 a[[0, 2]]

四种方式可以用逗号自由组合,左侧和右侧各用不同的方式。例如:a[0, [1, 2, 4]](第0行 + 花式选列)。