当前位置: 首页 > news >正文

【NumPy第二期:深入学习NumPy:切片、索引与数组操作进阶】

🚀 作者 :“码上有前”
🚀 文章简介 :NumPy
🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬
请添加图片描述

在这里插入图片描述

深入学习NumPy:切片、索引与数组操作进阶

摘要:本文聚焦 NumPy 中切片、索引、广播、数组迭代及位运算等核心进阶知识。从基础切片索引的灵活取值,到高级索引的复杂数据筛选,再到广播机制简化不同形状数组运算、迭代数组高效遍历元素,以及位运算拓展数值操作场景,结合丰富代码示例与清晰原理阐释,帮助读者扎实掌握 NumPy 进阶用法,解锁高效数据处理与科学计算技能。

一、引言

NumPy 作为 Python 科学计算的基石,其对数组的灵活操作能力是高效处理数据的关键。除基础数组创建与属性外,切片、索引、广播等进阶功能,能让我们精准提取数据、简化运算逻辑。本文将深入拆解这些核心知识,助力大家更自如地运用 NumPy 应对复杂场景。

二、NumPy 切片和索引:精准提取数组元素

(一)基础切片语法

NumPy 数组的切片类似 Python 列表,但支持多维操作,语法为 arr[start:stop:step] ,各维度用逗号分隔。
一维数组示例

import numpy as np
arr_1d = np.arange(10)  # 创建 [0,1,2,3,4,5,6,7,8,9]
# 取索引 2 到 7(不包含7),步长1
slice_1d = arr_1d[2:7]  
print("一维切片结果:", slice_1d)  # 输出 [2 3 4 5 6]

二维数组示例

arr_2d = np.array([[1,2,3], [4,5,6], [7,8,9]])
# 取第1行(索引0),索引1到2的列
slice_2d = arr_2d[0, 1:3]  
print("二维切片结果:\n", slice_2d)  # 输出 [2 3]

(二)索引的多样玩法

  1. 整数索引:直接指定元素位置,多维数组可按维度逐个索引。
# 取二维数组第2行(索引1)第3列(索引2)元素
elem = arr_2d[1, 2]  
print("整数索引取值:", elem)  # 输出 6
  1. 布尔索引:用布尔数组筛选元素,常用于条件过滤。
# 筛选出大于5的元素
bool_idx = arr_2d > 5  
filtered = arr_2d[bool_idx]  
print("布尔索引结果:", filtered)  # 输出 [6 7 8 9]

三、NumPy 高级索引:复杂数据筛选

(一)整数数组索引

通过传入整数数组,可提取任意位置的元素,支持多维选取。

# 取 (0,1)、(1,2)、(2,0) 位置的元素
rows = np.array([0, 1, 2])
cols = np.array([1, 2, 0])
advanced_idx = arr_2d[rows, cols]  
print("整数数组索引结果:", advanced_idx)  # 输出 [2 6 7]

(二)布尔数组与整数数组混合索引

灵活组合两种索引方式,满足复杂筛选需求(注意维度匹配规则)。

# 先布尔筛选行,再整数索引列
row_mask = np.array([True, False, True])  # 保留第0、2行
col_idx = np.array([0, 2])  # 取第0、2列
mixed_idx = arr_2d[row_mask][:, col_idx]  
print("混合索引结果:\n", mixed_idx)  
# 输出 [[1 3]
#       [7 9]]

四、NumPy 广播(Broadcast):不同形状数组的运算魔法

(一)广播的核心规则

当两个数组形状不同时,NumPy 会自动扩展维度较小的数组,使其与较大数组“兼容”,规则如下:

  1. 维度从后往前比较,若某维度为 1 或与另一数组维度相等,则可广播。
  2. 最终扩展为两者维度的最大值。

示例:标量与数组运算

scalar = 2
arr = np.array([[1,2], [3,4]])
# 标量自动广播为 (2,2) 数组参与运算
result = arr * scalar  
print("广播运算结果:\n", result)  
# 输出 [[2 4]
#       [6 8]]

示例:不同维度数组运算

arr_a = np.array([[1,2], [3,4]])
arr_b = np.array([5, 6])  # 形状 (2,),广播为 (2,2)
result_broadcast = arr_a + arr_b  
print("不同维度广播结果:\n", result_broadcast)  
# 输出 [[ 6  8]
#       [ 8 10]]

(二)广播的应用场景

广播简化了循环运算,让代码更简洁,常用于:

  • 批量数据的标量修正(如所有元素加/乘一个值)。
  • 不同维度特征的组合运算(如矩阵与向量的逐行/列操作 )。

五、NumPy 迭代数组:遍历元素的高效方式

(一)基础迭代:for 循环遍历

直接遍历数组,多维数组默认按行(一维化)迭代。

# 遍历二维数组元素
for elem in arr_2d:print("行迭代元素:", elem)  
# 输出 [1 2 3]、[4 5 6]、[7 8 9]# 遍历所有元素(扁平化)
for elem in arr_2d.flat:print("扁平迭代元素:", elem, end=" ")  
# 输出 1 2 3 4 5 6 7 8 9 

(二)nditer 迭代器:灵活控制遍历

支持指定遍历顺序(如 C 序按行、F 序按列)、数据类型等,适合复杂遍历场景。

# 按列优先顺序遍历
for elem in np.nditer(arr_2d, order='F'):print("按列遍历元素:", elem, end=" ")  
# 输出 1 4 7 2 5 8 3 6 9 

(三)迭代时修改元素

通过 op_flags 标记,可在迭代中修改数组值(需注意原数组是否可写)。

arr_copy = arr_2d.copy()
# 迭代时将元素加倍
for elem in np.nditer(arr_copy, op_flags=['readwrite']):elem[...] = elem * 2  
print("迭代修改后数组:\n", arr_copy)  
# 输出 [[ 2  4  6]
#       [ 8 10 12]
#       [14 16 18]]

六、NumPy 数组操作:重塑、拼接与拆分

(一)数组重塑:reshape

改变数组维度,元素总数需保持不变。

arr = np.arange(6)
# 重塑为 2 行 3 列
reshaped = arr.reshape(2, 3)  
print("重塑后数组:\n", reshaped)  
# 输出 [[0 1 2]
#       [3 4 5]]

(二)数组拼接:concatenate

沿指定轴拼接多个数组,需保证除拼接轴外其他维度一致。

arr1 = np.array([[1,2], [3,4]])
arr2 = np.array([[5,6]])
# 沿 0 轴(行方向)拼接
concated = np.concatenate((arr1, arr2), axis=0)  
print("拼接后数组:\n", concated)  
# 输出 [[1 2]
#       [3 4]
#       [5 6]]

(三)数组拆分:split

按指定轴和位置拆分数组。

arr = np.arange(9).reshape(3, 3)
# 沿 0 轴拆分为 3 个小数组
split_arr = np.split(arr, 3, axis=0)  
for sub_arr in split_arr:print("拆分后的子数组:\n", sub_arr)  
# 分别输出 [[0 1 2]]、[[3 4 5]]、[[6 7 8]]

七、NumPy 位运算:二进制层面的操作

(一)常用位运算函数

NumPy 提供 bitwise_and(与)、bitwise_or(或)、bitwise_xor(异或)、invert(非)等函数,操作数组元素的二进制位。

a = np.array([1, 2], dtype=np.int8)  # 二进制:00000001、00000010
b = np.array([3, 1], dtype=np.int8)  # 二进制:00000011、00000001# 按位与运算
and_result = np.bitwise_and(a, b)  
print("按位与结果:", and_result)  # 输出 [1 0](二进制 00000001、00000000)# 按位或运算
or_result = np.bitwise_or(a, b)  
print("按位或结果:", or_result)  # 输出 [3 3](二进制 00000011、00000011)

(二)位运算的应用场景

位运算常用于:

  • 硬件控制(如寄存器标志位操作)。
  • 数据压缩与编码(利用二进制位特性优化存储)。
  • 特定算法(如哈希计算、图像处理的掩码操作 )。

八、总结

本文围绕 NumPy 切片、索引、广播、迭代、数组操作及位运算展开,这些进阶功能是高效处理数组数据的关键。切片与索引让我们精准“抓取”数据,广播简化不同形状数组运算,迭代实现元素灵活遍历,数组操作覆盖重塑、拼接等实用需求,位运算拓展二进制层面玩法。熟练掌握这些知识,能大幅提升 NumPy 编程效率,为数据分析、机器学习等上层应用筑牢基础。后续可结合实际项目,持续深化对这些功能的运用,解锁更复杂的科学计算场景!

文中代码可直接在 Python 环境(安装 NumPy 库)运行验证,配合输出结果理解原理。若需更深入学习某部分(如广播的复杂维度匹配案例),可进一步扩展示例补充~

http://www.lqws.cn/news/606547.html

相关文章:

  • Java类加载机制及关于时序数据库IoTDB排查
  • 阿里云AppFlow AI助手打造智能搜索摘要新体验
  • 01背包问题[经典][动态规划]
  • RT Thread Studio修改堆区大小的方法
  • pytorch学习-9.多分类问题
  • 第8章网络协议-NAT
  • 微信小程序入门实例_____打造你的专属单词速记小程序
  • 开源 | V3.1.1慧知开源重卡运营充电桩平台 - 重卡运营充电桩平台管理解决方案;企业级完整代码 多租户、模拟器、多运营商、多小程序;
  • Qt 5.9 XML文件写入指南
  • React Native 安卓、苹果、鸿蒙5.0 三端适配方案:条件编译 + 平台适配层
  • 如何设置电脑定时休眠?操作指南详解
  • 前端面试专栏-主流框架:16. vue工程化配置(Vite、Webpack)
  • 哪款即时通讯服务稳定性靠谱?18家对比
  • 虚拟 SD 卡 MBR 与分区表结构深度解析:基于 QEMU 生成的 2G RAW 镜像
  • 解决 Cannot create Swift scratch context
  • WPF学习笔记(21)ListBox、ListView与控件模板
  • minio详细教程丨如何3分钟搭建minio
  • 操作系统考试大题-处理机调度算法-详解-1
  • Ollama最新快速上手指南:从安装到精通本地AI模型部署
  • 容器与 Kubernetes 基本概念与架构
  • pnpm 升级
  • 解决在Pom文件中写入依赖坐标后, 刷新Maven但是多次尝试都下载不下来
  • 使用开源项目youlai_boot 导入到ecplise 中出现很多错误
  • 【飞算JavaAI】智能开发助手赋能Java领域,飞算JavaAI全方位解析
  • Kuikly 与 Flutter 的全面对比分析,结合技术架构、性能、开发体验等核心维度
  • Flutter
  • Oracle 证书等级介绍
  • Rust 安装使用教程
  • 去中心化身份:2025年Web3身份验证系统开发实践
  • 【数据结构】排序算法:冒泡与快速