展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > 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
相关文章 更多
精品专题 更多
本月促销

正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

装机必备

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

Windows

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

macOS软件

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

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
灵活计算器
灵活计算器

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

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。