NumPy数组切片

发布于:2025-05-27 ⋅ 阅读:(64) ⋅ 点赞:(0)

NumPy数组切片

NumPy​​切片(Slicing)​ ​操作允许高效地访问和操作数组的子集,其语法与 Python 列表类似但更强大,支持​ ​多维切片​ ​和​ ​视图机制​​(非副本)。以下是核心用法详解:

一、基础切片语法​​

切片语法为 start:stop:step,对每个维度独立生效。
​​规则​​:

  • start:起始索引(包含)
  • stop:结束索引(不包含)
  • step:步长(默认1)

​二、一维数组切片​

import numpy as np

arr = np.array([0, 1, 2, 3, 4, 5])

# 获取索引2到4(不包含4)的元素
print(arr[2:4])        # 输出: [2 3]

# 前三个元素
print(arr[:3])         # 输出: [0 1 2]

# 每隔一个元素取一次
print(arr[::2])        # 输出: [0 2 4]

# 反转数组
print(arr[::-1])       # 输出: [5 4 3 2 1 0]

三、多维数组切片​​

每个维度用逗号分隔,支持独立切片规则。

​二维数组示例​

matrix = np.array([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])

# 获取前两行的第2、3列
print(matrix[:2, 1:3])
# 输出:
# [[2 3]
#  [5 6]]

# 所有行的第1列
print(matrix[:, 0])    # 输出: [1 4 7]

# 每隔一行、逆序列
print(matrix[::2, ::-1])
# 输出:
# [[3 2 1]
#  [9 8 7]]

​三维数组示例

cube = np.array([[[1, 2], [3, 4]],
                 [[5, 6], [7, 8]]])

# 第二个二维块的第一行、所有列
print(cube[1, 0, :])   # 输出: [5 6]

四、高级切片技巧​​

1. ​​省略号(…)自动补全维度

rnd = np.random.default_rng(1800)
arr_4d = rnd.integers(10, size=(2, 3, 4, 5))
arr_4d

高维NumPy数组

# 获取第一个3D块的前两行、所有列
arr_4d[0, :2, :, :]

第一个3D块的前两行、所有列

2. 布尔掩码切片

data = np.array([5, 12, 8, 3])
mask = data > 6
print(data[mask])   # 输出: [12 8]

3. 整数数组索引(Fancy Indexing)

print(matrix[[0, 2], [1, 0]])  # 输出: [2 7] → 取(0,1)和(2,0)位置元素

五、视图 vs 副本​​​

  • ​视图(View)​​:切片操作默认返回​​原数组数据的引用​​,修改切片会影响原数组
sub_matrix = matrix[:2, :2]
sub_matrix[0,0] = 100
print(matrix[0,0])  # 输出: 100 → 原数组被修改
  • 副本(Copy)​​:显式调用 .copy() 创建独立副本
sub_copy = matrix[:2, :2].copy()
sub_copy[0,0] = 200
print(matrix[0,0])  # 仍为100 → 原数组不变

六、注意事项​

    1. ​内存布局​​: 切片视图的内存与原数组连续,可能影响计算效率
    1. 负步长​​:step < 0 时,start 应大于 stop
    1. 维度保留​​: 使用 np.newaxis 可增加维度(如将向量转为矩阵)

七、总结​

场景​​ ​ ​推荐操作​​
提取局部数据 基础切片 start:stop:step
批量修改子集 切片 + 赋值操作
需要独立数据副本时 显式调用 .copy()
跨步长采样 设置 step 参数(如 ::2