科普:NumPy 中多维数组的切片操作

NumPy 中多维数组的切片操作是处理高维数据(如矩阵、图像等)的核心技能,其语法在一维切片基础上扩展,通过逗号分隔不同维度的切片规则,实现对多维度数据的精准提取。

一、基本语法

多维数组的切片格式为:
arr[dim1_slice, dim2_slice, ..., dimN_slice]

其中,每个 dim_slice 表示对应维度的切片规则,支持与一维数组相同的切片语法:start:stop:step(起始索引:结束索引:步长),且各维度切片独立生效。

  • 默认值start 默认为 0stop 默认为维度长度,step 默认为 1
  • 负数索引:表示从末尾开始(如 -1 为最后一个元素)。

二、核心切片方式及示例

假设存在一个 3 维数组 arr( shape 为 (4, 5, 6),可理解为 4 个 5 行 6 列的矩阵):

import numpy as np
arr = np.arange(4*5*6).reshape(4, 5, 6)  # shape: (4, 5, 6)
1. 各维度独立切片(最常用)

对每个维度分别指定 start:stop:step,提取对应范围的子数组。

  • 示例 1(二维数组简化):
    shape=(5,6) 的二维数组 mat = arr[0](取 3 维数组的第 0 个矩阵):

    mat[1:4, 2:5]  # 第1-3行(索引1到3,不含4),第2-4列(索引2到4,不含5)
    # 结果 shape: (3, 3)
    
  • 示例 2(三维数组):

    arr[1:3, :3, ::2]  # 第1-2个矩阵(0维:1到2),前3行(1维:0到2),列隔1取1(2维:步长2)
    # 结果 shape: (2, 3, 3)
    
2. 省略维度(:...
  • : 表示取全维度:某维度用 : 时,提取该维度的所有元素。
    示例:arr[:, 2, :] 表示取 0 维全量、1 维索引 2、2 维全量,结果 shape 为 (4, 6)

  • ...(省略号)表示“剩余所有维度”:简化高维数组的切片写法,尤其适合维度数不确定的场景。
    示例:

    arr[..., 3]  # 等价于 arr[:, :, 3],取最后一个维度的索引3,结果 shape: (4, 5)
    arr[1, ...]  # 等价于 arr[1, :, :],取第0维索引1的所有元素,结果 shape: (5, 6)
    
3. 整数索引与切片结合

若某维度用整数索引(而非切片),则该维度会被“压缩”(降维)。

示例:

arr[2, 1:4, :]  # 0维用整数索引2(取第3个矩阵),1维切片1:4,2维全取
# 结果 shape: (3, 6)(原3维→2维,因0维被压缩)
4. 步长与逆序
  • 步长 step:控制切片的间隔,step>0 正向取,step<0 反向取(逆序)。

示例:

arr[::2, :, ::-1]  # 0维:隔1取1(取0,2矩阵);2维:逆序(列从后往前取)
# 结果 shape: (2, 5, 6)
5. 布尔切片(条件筛选)

通过布尔数组(与原数组维度匹配)筛选元素,返回满足条件的所有元素(一维数组)。

示例:

mask = arr > 100  # 生成与arr同shape的布尔数组(True/False)
arr[mask]  # 提取所有值>100的元素,结果为1维数组

三、注意事项

  1. 切片返回的是“视图”而非副本:修改切片结果会同步影响原数组(与 Python 列表不同)。
    示例:

    sub = arr[1:3, 2:4]
    sub[0,0] = 999  # 原数组 arr[1,2] 会被改为 999
    

    若需副本,需显式复制:sub = arr[1:3, 2:4].copy()

  2. 索引越界:切片的 stop 超过维度长度时,自动截断(不报错);但整数索引越界会报错。

  3. 维度顺序:NumPy 数组的维度顺序(如 (height, width, channel))需结合具体场景理解,避免切片时混淆维度。

多维数组切片的核心是“按维度独立处理”,通过 start:stop:step、整数索引、... 等组合,可灵活提取任意子数组。掌握切片规则能极大提升处理高维数据(如图像、张量)的效率。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值