📌 NumPy ndarray
的索引与切片(Indexing & Slicing)
NumPy 提供 灵活高效 的索引与切片方式,支持 一维、二维、多维数组 的访问与操作。
1️⃣ 索引(Indexing)
索引用于访问 NumPy 数组中的 单个元素。
一维数组索引
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
print(arr[0]) # 访问第 1 个元素 -> 10
print(arr[-1]) # 访问最后 1 个元素 -> 50
print(arr[2]) # 访问索引 2 的元素 -> 30
二维数组索引
arr2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print(arr2d[0, 1]) # 访问第 1 行第 2 列 -> 2
print(arr2d[2, -1]) # 访问最后 1 行最后 1 列 -> 9
arr2d[0, 1]
:表示第 0 行、1 列。arr2d[2, -1]
:表示 最后 1 行、最后 1 列(负索引)。
2️⃣ 切片(Slicing)
切片用于提取 数组的子集,语法如下:
array[start:stop:step]
start
:起始索引(包含)。stop
:结束索引(不包含)。step
:步长(默认为1
)。
一维数组切片
arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(arr[2:7]) # 取索引 2 到 6 -> [2 3 4 5 6]
print(arr[:5]) # 取前 5 个元素 -> [0 1 2 3 4]
print(arr[3:]) # 从索引 3 开始到结尾 -> [3 4 5 6 7 8 9]
print(arr[::2]) # 每隔 2 取一个 -> [0 2 4 6 8]
print(arr[::-1]) # 逆序数组 -> [9 8 7 6 5 4 3 2 1 0]
二维数组切片
arr2d = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
print(arr2d[:2, 1:3]) # 取前 2 行,第 2~3 列 -> [[2 3]
# [6 7]]
print(arr2d[1:, ::2]) # 从第 2 行开始,每隔 2 列取值 -> [[5 7]
# [9 11]]
print(arr2d[::-1, ::-1]) # 行和列都逆序 -> [[12 11 10 9]
# [8 7 6 5]
# [4 3 2 1]]
3️⃣ 高级索引(Boolean & Fancy Indexing)
NumPy 支持 布尔索引 和 花式索引,可实现更复杂的数据提取。
(1) 布尔索引
arr = np.array([10, 20, 30, 40, 50])
mask = arr > 25 # 返回布尔数组:[False False True True True]
print(arr[mask]) # 取出大于 25 的元素 -> [30 40 50]
# 直接写
print(arr[arr % 20 == 0]) # 取能被 20 整除的数 -> [20 40]
(2) 花式索引(Fancy Indexing)
arr = np.array([10, 20, 30, 40, 50])
idx = [0, 3, 4] # 选索引 0, 3, 4
print(arr[idx]) # -> [10 40 50]
arr2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
rows = [0, 1, 2] # 选 3 行
cols = [2, 1, 0] # 选 3 列
print(arr2d[rows, cols]) # -> [3 5 7]
📝 总结
操作 | 语法示例 | 说明 |
---|---|---|
索引 | arr[2] |
访问索引 2 位置的元素 |
二维索引 | arr2d[1, 2] |
访问第 2 行第 3 列 |
切片 | arr[1:4] |
取索引 1 到 3(不含 4) |
步长 | arr[::2] |
每隔 2 取 1 个 |
逆序 | arr[::-1] |
逆序数组 |
布尔索引 | arr[arr > 20] |
取大于 20 的元素 |
花式索引 | arr[[1, 3, 4]] |
取索引 1, 3, 4 |
NumPy 索引 & 切片 可实现高效数据操作 🚀