当前位置:

首页 > 编程开发 > Python numpy索引与切片完整代码示例

Python numpy索引与切片完整代码示例

NumPy的索引与切片功能强大,涵盖基本索引、切片、花式索引、布尔索引及np.where等工具。切片返回视图,修改会改变原数组;花式索引与布尔索引返回副本。多条件筛选需用括号与&、|运算符。np.take与np.put实现按索引取值与设值,np.select与np.clip处理多条件与裁剪。

NumPy 的索引能力远不是 Python 列表能比的——基本索引、切片、花式索引、布尔索引,一套组合拳下来,数据操作变得异常灵活。下面从头梳理这些技巧,代码即学即用。

基本索引与切片

一维数组

import numpy as np

arr = np.array([10, 20, 30, 40, 50, 60])

# 基本索引
print(arr[0])        # 10
print(arr[-1])       # 60(倒数第一)
print(arr[-2])       # 50

# 切片(返回视图,非副本!)
print(arr[1:4])      # [20 30 40]
print(arr[:3])       # [10 20 30](前 3 个)
print(arr[3:])       # [40 50 60](从第 3 个到最后)
print(arr[::2])      # [10 30 50](步长 2)
print(arr[::-1])     # [60 50 40 30 20 10](反转)

# 切片赋值(会修改原数组!)
arr[1:4] = 99
print(arr)           # [10 99 99 99 50 60]

二维数组

mat = np.arange(12).reshape(3, 4)
print(mat)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

# 单个元素
print(mat[0, 0])     # 0
print(mat[2, -1])    # 11

# 整行 / 整列
print(mat[1])        # [4 5 6 7](第 1 行)
print(mat[1, :])     # 同上
print(mat[:, 2])     # [ 2  6 10](第 2 列)

# 子矩阵(切片)
print(mat[0:2, 1:3])
# [[1 2]
#  [5 6]]

# 步长切片
print(mat[::2, ::2])  # 每隔一行、每隔一列
# [[ 0  2]
#  [ 8 10]]

# 行 + 列混合
print(mat[0, :2])     # [0 1](第 0 行前 2 列)
print(mat[:2, -1])    # [3 7](前 2 行最后 1 列)

三维及以上

tensor = np.arange(24).reshape(2, 3, 4)
# shape: (2, 3, 4) — 2 个矩阵,每个 3×4

print(tensor[0])           # 第一个 3×4 矩阵
print(tensor[0, 1])        # 第一个矩阵的第 1 行 → (4,)
print(tensor[0, 1, 2])    # 标量 → 6
print(tensor[:, 0, :])     # 每个矩阵的第 0 行 → (2, 4)
print(tensor[:, :, ::2])   # 每矩阵每隔一列 → (2, 3, 2)

...(Ellipsis)省略号

arr = np.arange(120).reshape(2, 3, 4, 5)

# 等价写法
print(arr[0, :, :, :])     # 完整写法
print(arr[0, ...])          # 用 ... 代替中间的 :
print(arr[..., 2])          # 最后一个维度的第 2 索引 → (2, 3, 4)
print(arr[0, ..., :3])      # 第一个块,最后维取前 3 → (3, 4, 3)

花式索引(Fancy Indexing)

用整数数组来索引,返回副本(非视图)。这点和切片完全不同,后面会对比。

一维花式索引

arr = np.array([10, 20, 30, 40, 50])

# 用列表指定索引
print(arr[[0, 2, 4]])         # [10 30 50]

# 可以用任意整数数组
indices = np.array([4, 1, 1, 3])
print(arr[indices])           # [50 20 20 40]

# 可以任意顺序、重复
print(arr[[4, 4, 4, 0, 0]])  # [50 50 50 10 10]

二维花式索引

mat = np.arange(12).reshape(3, 4)

# 指定行索引
print(mat[[0, 2]])             # 第 0 行和第 2 行
# [[ 0  1  2  3]
#  [ 8  9 10 11]]

# 指定行 + 列索引
print(mat[[0, 2, 1], [0, 3, 1]])  # 取 (0,0), (2,3), (1,1) → [0 11 5]

# ix_: 取行和列的笛卡尔积(子矩阵)
print(mat[np.ix_([0, 2], [1, 3])])
# [[ 1  3]
#  [ 9 11]]
# ix_ 等价于 mat[[0,2]][:, [1,3]]

花式索引 vs 切片

mat = np.arange(12).reshape(3, 4)

# 切片返回视图
view = mat[:2, :2]
view[0, 0] = 99
print(mat[0, 0])  # 99 ← 原数组被修改了!

# 花式索引返回副本
copy = mat[[0, 1]][:, [0, 1]]
copy[0, 0] = 999
print(mat[0, 0])  # 99 ← 原数组未修改

布尔索引

arr = np.array([15, 3, 8, 22, 1, 9, 13])

# 条件直接筛选
print(arr[arr > 10])         # [15 22 13]

# 多条件(用 & | ~,必须加括号!)
print(arr[(arr > 5) & (arr < 20)])  # [15 8 9 13]
print(arr[(arr < 5) | (arr > 20)])  # [3 22 1]
print(arr[~(arr > 10)])             # [3 8 1 9]

# ⚠️ 常见错误:用 and/or 或不加括号
# arr[arr > 5 and arr < 20]    ← 报错!
# arr[arr > 5 & arr < 20]       ← 结果错误(& 优先级高)!
# arr[(arr > 5) & (arr < 20)]   ← 正确!

二维布尔索引

mat = np.arange(12).reshape(3, 4)

# 按条件筛选行
print(mat[mat[:, 0] > 3])     # 第 0 列 >3 的行
# [[ 4  5  6  7]
#  [ 8  9 10 11]]

# 整体条件
mask = mat > 5
print(mat[mask])               # [6 7 8 9 10 11](返回一维数组)

布尔掩码赋值

arr = np.array([15, 3, 8, 22, 1, 9, 13])

arr[arr > 10] = 0             # 所有 >10 的变 0
print(arr)                     # [0 3 8 0 1 9 0]

arr[arr < 5] = -1             # 所有 <5 的变 -1
print(arr)                     # [-1 -1 8 0 -1 9 -1]

np.where()——条件索引三剑客

条件替换(三元运算)

arr = np.array([15, 3, 8, 22, 1, 9, 13])

# where(条件, True时的值, False时的值)
result = np.where(arr > 10, 1, 0)
print(result)  # [1 0 0 1 0 0 1]

result = np.where(arr > 10, arr, -arr)
print(result)  # [ 1 -3 -8  1 -1 -9  1]

条件查找(返回索引)

arr = np.array([15, 3, 8, 22, 1, 9, 13])

# 找到满足条件的索引
indices = np.where(arr > 10)
print(indices)          # (array([0, 3, 6]),)  ← 返回元组!
print(indices[0])       # [0 3 6](一维时)
print(arr[indices])     # [15 22 13]

# 二维
mat = np.arange(12).reshape(3, 4)
rows, cols = np.where(mat > 5)
print(rows)  # [1 1 2 2 2 2] — 行索引
print(cols)  # [2 3 0 1 2 3] — 列索引
print(mat[rows, cols])  # [6 7 8 9 10 11] — 值

多条件组合

# np.where 也可以处理多条件
arr = np.arange(10)
result = np.where((arr > 3) & (arr < 8), arr * 10, arr)
print(result)  # [0 1 2 3 40 50 60 70 8 9]

np.argwhere()——获取非零/True 索引

arr = np.array([0, 5, 0, 3, 0, 8, 0])
print(np.argwhere(arr > 0))
# [[1]
#  [3]
#  [5]]

# 和 where 的区别:argwhere 返回 (N, ndim) 数组,where 返回元组

np.take()/np.put()——按索引取值/设值

arr = np.array([10, 20, 30, 40, 50])

# take: 按索引取值
print(arr.take([0, 2, 4]))       # [10 30 50]
print(np.take(arr, [4, 3, 3]))   # [50 40 40]

# 二维按轴取
mat = np.arange(12).reshape(3, 4)
print(np.take(mat, [0, 2], axis=0))   # 取第 0、2 行
print(np.take(mat, [0, 2], axis=1))   # 取第 0、2 列

# put: 按索引设值(原地修改)
arr = np.array([10, 20, 30, 40, 50])
np.put(arr, [0, 2], [99, 88])
print(arr)  # [99 20 88 40 50]

np.select()/np.clip()——多条件/裁剪

# select: 多条件多选择
arr = np.array([15, 3, 8, 22, 1, 9, 13])

conditions = [arr < 5, arr > 15, True]  # True = 兜底
choices = [-1, 1, 0]

result = np.select(conditions, choices)
print(result)  # [0 -1 0 1 -1 0 0]

# clip: 限制在范围内
print(np.clip(arr, 5, 15))   # [15 5 8 15 5 9 13]
print(arr.clip(5, 15))       # 同上(方法形式)

多维索引技巧

按行列号取值

mat = np.arange(12).reshape(3, 4)

# 提取对角线
print(np.diag(mat))            # [0 5 10]
print(np.diag(mat, k=1))       # [1 6 11](上对角线)

# 提取上三角 / 下三角
print(np.triu(mat))            # 上三角(含对角线)
print(np.tril(mat, k=-1))      # 下三角(不含对角线)

# 索引数组组合
row_indices = np.array([0, 1, 2])
col_indices = np.array([3, 2, 1])
print(mat[row_indices, col_indices])  # [3 6 9] — 取 (0,3),(1,2),(2,1)

按轴索引(take_along_axis)

mat = np.arange(12).reshape(3, 4)
# 取每行最大值的索引对应的列
col_idx = mat.argmax(axis=1)           # [3 3 3]
result = np.take_along_axis(mat, col_idx[:, None], axis=1)
print(result)  # [[3] [7] [11]]

速查表

需求代码
单个元素arr[0, 1] / arr[-1]
整行/列arr[1, :] / arr[:, 2]
子矩阵arr[0:2, 1:3]
步长切片arr[::2, ::3]
反转arr[::-1]
省略号arr[0, ..., :3]
花式行索引arr[[0, 2, 4]]
笛卡尔积索引arr[np.ix_([0,2], [1,3])]
布尔筛选arr[arr > 10]
多条件arr[(a>3) & (a<10)]
条件替换np.where(arr > 0, 1, -1)
条件查找np.where(arr > 0)
列表取值np.take(arr, [0, 2])
多条件选择np.select(conds, choices)
裁剪np.clip(arr, lo, hi)

[[numpy-总览|← 返回总览]]

总结

本文内容来源于网友投稿,如有侵权请联系删除。
作者最新文章
编程开发 Python
相关文章 更多
解决PHP递归报错:max_nesting_level限制与内存溢出处理
解决PHP递归报错:max_nesting_level限制与内存溢出处理

遇到PHP递归报错时,不要盲目调大max_nesting_level。本文教你区分Xdebug限制、内存耗尽和正则递归错误,提供代码级的终止条件优化与迭代替代方案,彻底解决栈溢出问题。

PHP递归中static变量与引用传递的常见陷阱及调试
PHP递归中static变量与引用传递的常见陷阱及调试

本文分析PHP递归中static变量导致的状态污染及引用传递引发的共享数据修改问题。提供具体的代码复现、缓存键设计建议及调试打印技巧,帮助开发者避免隐蔽的逻辑错误。

PHP递归性能优化技巧与迭代替代方案
PHP递归性能优化技巧与迭代替代方案

解析PHP递归函数在树形数据处理中的性能瓶颈,提供预加载数据消除I/O、使用显式栈替代深层递归的实战方案,帮助开发者在代码可读性与执行效率间做出合理取舍。

Java测试中怎么使用Mockito模拟依赖对象
Java测试中怎么使用Mockito模拟依赖对象

详细讲解在Java单元测试中如何使用Mockito模拟依赖对象,包括引入依赖、创建Mock、打桩返回值、行为验证以及Mock与Spy的核心差异和常见陷阱排查。

链表删除节点的时间复杂度是多少及其详细分析
链表删除节点的时间复杂度是多少及其详细分析

详细分析链表删除节点的时间复杂度,深入探讨单链表与双向链表在不同已知前提下的查找与删除开销,并结合完整代码与清晰图解进行对比总结。

codex如何配置模型参数及文件设置教程
codex如何配置模型参数及文件设置教程

想知道如何让AI写出的代码更贴合你的习惯?本文手把手教你在VS Code中调整Codex相关模型参数,通过修改配置文件优化温度值和令牌限制,解决代码建议不准确或响应慢的问题。

Claude Code AI编程工具实力揭秘与编程助手实测
Claude Code AI编程工具实力揭秘与编程助手实测

通过实测展示Claude Code在终端中如何理解自然语言指令、自动修改代码文件并处理复杂编程任务,帮助开发者评估其实际辅助能力。

winforms教程自学入门与基础开发步骤详解
winforms教程自学入门与基础开发步骤详解

本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

Cursor自动补全设置教程教你快速开启代码补全功能
Cursor自动补全设置教程教你快速开启代码补全功能

详解Cursor编辑器中自动补全功能的开启与优化设置,涵盖Tab触发机制、上下文窗口调整及模型切换,帮助开发者解决补全延迟、干扰大等问题,提升编码流畅度。

pandas的数据格式怎么转换和设置方法教程
pandas的数据格式怎么转换和设置方法教程

详解Pandas中数据格式转换的核心方法,包括astype强制转换、to_numeric容错处理及日期解析技巧,解决常见类型错误并提升数据处理效率。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

WINDOWS 更多
3dmax(3ds max)
3dmax(3ds max)
Windows

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。