数组索引与切片
学习目标
- 掌握一维和多维数组的基本索引与切片
- 学会使用布尔索引进行条件筛选
- 了解花式索引(Fancy Indexing)
- 理解视图(View)与拷贝(Copy)的区别
一维数组的索引与切片
一维数组的索引和 Python 列表基本一致:
import numpy as np
arr = np.array([10, 20, 30, 40, 50, 60, 70, 80])
# ===== 基本索引 =====
print(arr[0]) # 10 第一个元素
print(arr[3]) # 40 第四个元素
print(arr[-1]) # 80 最后一个元素
print(arr[-2]) # 70 倒数第二个
# ===== 切片 [start:stop:step] =====
print(arr[2:5]) # [30 40 50] 索引 2 到 4
print(arr[:3]) # [10 20 30] 前 3 个
print(arr[5:]) # [60 70 80] 从索引 5 到末尾
print(arr[::2]) # [10 30 50 70] 每隔一个取一个
print(arr[::-1]) # [80 70 60 50 40 30 20 10] 反转
二维数组的索引与切片
二维数组使用 [行, 列] 的方式访问:
matrix = np.array([
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
])
访问单个元素
print(matrix[0, 0]) # 1 第 0 行第 0 列
print(matrix[1, 2]) # 7 第 1 行第 2 列
print(matrix[-1, -1]) # 16 最后一行最后一列
访问整行/整列
print(matrix[0]) # [1 2 3 4] 第 0 行(整行)
print(matrix[0, :]) # [1 2 3 4] 同上,更明确的写法
print(matrix[:, 0]) # [ 1 5 9 13] 第 0 列(整列)
print(matrix[:, -1]) # [ 4 8 12 16] 最后一列
行列切片
# 取前 2 行、前 3 列
sub = matrix[:2, :3]
print(sub)
# [[1 2 3]
# [5 6 7]]
# 取第 1~2 行、第 2~3 列
sub2 = matrix[1:3, 2:4]
print(sub2)
# [[ 7 8]
# [11 12]]
# 每隔一行取(第 0、2 行)
sub3 = matrix[::2]
print(sub3)
# [[ 1 2 3 4]
# [ 9 10 11 12]]
图解二维索引
matrix =
列0 列1 列2 列3
行0 [ 1 2 3 4 ]
行1 [ 5 6 7 8 ]
行2 [ 9 10 11 12 ]
行3 [ 13 14 15 16 ]
matrix[1, 2] → 7 (第 1 行第 2 列)
matrix[:2, :3] → [[1,2,3], [5,6,7]] (前 2 行,前 3 列)
matrix[:, 1] → [2, 6, 10, 14] (所有行,第 1 列)
布尔索引:条件筛选
这是 NumPy 最强大的功能之一——用条件表达式直接筛选数据!
基本原理
arr = np.array([15, 23, 8, 42, 31, 5, 19, 27])
# 第一步:条件表达式生成布尔数组
mask = arr > 20
print(mask) # [False True False True True False False True]
# 第二步:用布尔数组作为索引,筛选出 True 对应的元素
result = arr[mask]
print(result) # [23 42 31 27]
# 通常合并成一行
print(arr[arr > 20]) # [23 42 31 27]
常用条件筛选
scores = np.array([85, 92, 78, 65, 95, 43, 88, 72, 55, 90])
# 及格成绩(>= 60)
print(scores[scores >= 60]) # [85 92 78 65 95 88 72 90]
# 优秀成绩(>= 90)
print(scores[scores >= 90]) # [92 95 90]
# 不及格成绩(< 60)
print(scores[scores < 60]) # [43 55]
# 60~80 之间的成绩(多条件用 & 连接,每个条件加括号)
print(scores[(scores >= 60) & (scores <= 80)]) # [78 65 72]
# 低于 60 或高于 90 的成绩(多条件用 | 连接)
print(scores[(scores < 60) | (scores > 90)]) # [92 95 43 55]
# 取反(~)
print(scores[~(scores >= 60)]) # [43 55] 等价于 scores[scores < 60]
多条件的语法
NumPy 中多条件组合不能用 Python 的 and / or,必须用:
&代替and(且)|代替or(或)~代替not(非)- 每个条件必须加括号
# ❌ 错误写法
arr[arr > 5 and arr < 20]
# ✅ 正确写法
arr[(arr > 5) & (arr < 20)]
布尔索引在二维数组中的应用
matrix = np.array([
[85, 92, 78],
[65, 95, 43],
[88, 72, 90]
])
# 找出所有大于 80 的成绩
print(matrix[matrix > 80]) # [85 92 95 88 90]
# 注意:结果变成了一维数组!
# 把不及格的成绩改成 60(条件赋值)
matrix[matrix < 60] = 60
print(matrix)
# [[85 92 78]
# [65 95 60] ← 43 被改成了 60
# [88 72 90]]
花式索引(Fancy Indexing)
花式索引允许你用整数数组作为索引,一次取出多个指定位置的元素: