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

Python切片技巧,带你轻松提取数组子集!

在数据分析和科学计算中,灵活地处理数组数据是非常重要的技能。Python的Numpy库提供了强大的数组操作功能,其中数组切片(slicing)是一个非常重要且常用的技术。通过数组切片,可以轻松地提取数组的子集、修改数组中的部分数据,甚至可以通过切片高效地进行数据重组和分析。本文将详细介绍Numpy数组切片的各种技巧和应用场景,并通过丰富的示例代码帮助你掌握这一技能。

数组切片的基本概念

数组切片是一种通过指定索引范围来提取数组部分数据的操作方式。Numpy数组的切片操作类似于Python列表的切片,但功能更加丰富。切片可以用于一维数组、二维数组,甚至更高维的数组。

切片的语法

Numpy数组的切片语法如下:array[start:stop:step]

start:起始索引,包含该索引,默认为0。

stop:结束索引,不包含该索引,默认为数组长度。

step:步长,默认为1。

可以通过调整start、stop和step的值来提取数组中的子集。

一维数组切片首先,来看一个简单的一维数组的切片操作:

import numpy as np


# 创建一维数组
arr = np.array([10, 20, 30, 40, 50, 60, 70, 80, 90])

# 提取索引2到5之间的元素
subset = arr[2:6]
print("索引2到5之间的子集:", subset)

# 每隔一个元素提取一次
subset_step = arr[::2]
print("每隔一个元素提取一次:", subset_step)

# 反向提取数组
subset_reverse = arr[::-1]
print("反向提取数组:", subset_reverse)
输出结果:索引2到5之间的子集: [30 40 50 60]
每隔一个元素提取一次: [10 30 50 70 90]
反向提取数组: [90 80 70 60 50 40 30 20 10]

在这个示例中,展示了基本的一维数组切片操作,包括按范围提取、按步长提取以及反向提取数组的方式。二维数组切片在二维数组中,切片操作可以用于提取特定的行、列或子矩阵。切片操作的语法与一维数组类似,只不过需要为每个维度分别指定切片参数。

提取二维数组的子集

# 创建二维数组

arr2d = np.array([[1, 2, 3, 4],
                  [5, 6, 7, 8],
                  [9, 10, 11, 12],
                  [13, 14, 15, 16]])

# 提取前两行和前两列
subset_2d = arr2d[:2, :2]
print("前两行和前两列的子集:\n", subset_2d)

# 提取第三行的所有元素
third_row = arr2d[2, :]
print("第三行的元素:", third_row)

# 提取第二列的所有元素
second_column = arr2d[:, 1]
print("第二列的元素:", second_column)
输出结果:前两行和前两列的子集:
 [[1 2]
 [5 6]]

第三行的元素: [ 9 10 11 12]

第二列的元素: [ 2  6 10 14]

在这个示例中,通过切片操作提取了二维数组的部分数据,包括子矩阵、特定行和特定列。

提取矩阵的子矩阵

# 提取一个2x2的子矩阵

sub_matrix = arr2d[1:3, 1:3]
print("2x2的子矩阵:\n", sub_matrix)
输出结果:2x2的子矩阵:
 [[ 6  7]
 [10 11]]

这个示例展示了如何从一个4x4的矩阵中提取一个2x2的子矩阵。高维数组的切片对于更高维的数组(例如三维数组),切片操作同样适用。只需为每个维度指定相应的切片范围即可。

三维数组的切片

# 创建一个三维数组

arr3d = np.array([[[1, 2, 3],
                   [4, 5, 6]],
                  [[7, 8, 9],
                   [10, 11, 12]],
                  [[13, 14, 15],
                   [16, 17, 18]]])

# 提取第一个二维子数组
subset_3d = arr3d[0, :, :]
print("第一个二维子数组:\n", subset_3d)

# 提取第三维度的所有元素
third_dim_elements = arr3d[:, :, 2]
print("第三维度的元素:\n", third_dim_elements)
输出结果:第一个二维子数组:
 [[1 2 3]
 [4 5 6]]

第三维度的元素:
 [[ 3  6]
 [ 9 12]
 [15 18]]

在这个示例中,展示了如何对三维数组进行切片操作,包括提取二维子数组和提取特定维度的元素。切片的高级应用除了基本的切片操作,Numpy还支持一些高级的切片技巧,这些技巧在复杂的数据操作和分析中非常有用。

多维数组的步长切片

# 创建一个6x6的二维数组

arr_large = np.arange(36).reshape(6, 6)
print("原始数组:\n", arr_large)

# 每隔两行两列提取一次
step_slice = arr_large[::2, ::2]
print("每隔两行两列提取一次:\n", step_slice)
输出结果:原始数组:
 [[ 0  1  2  3  4  5]
  [ 6  7  8  9 10 11]
  [12 13 14 15 16 17]
  [18 19 20 21 22 23]
  [24 25 26 27 28 29]
  [30 31 32 33 34 35]]

每隔两行两列提取一次:
 [[ 0  2  4]
  [12 14 16]
  [24 26 28]]

在这个示例中,展示了如何通过步长切片来提取二维数组的部分数据,这种操作可以用来提取数据的子样本或进行降采样。通过切片修改数组切片不仅可以用来提取数据,还可以用来修改数组中的部分数据。

# 修改数组的部分元素

arr_large[2:4, 2:4] = 99
print("修改后的数组:\n", arr_large)
输出结果:修改后的数组:
 [[ 0  1  2  3  4  5]
  [ 6  7  8  9 10 11]
  [12 13 99 99 16 17]
  [18 19 99 99 22 23]
  [24 25 26 27 28 29]
  [30 31 32 33 34 35]]

在这个示例中,使用切片操作修改了数组中的部分数据,这在数据清洗和预处理过程中非常常见。通过切片提取对角线元素有时需要提取矩阵的对角线元素,Numpy中的切片和高级索引结合使用,可以轻松实现这一点。

# 提取矩阵的对角线元素

diagonal_elements = arr_large[np.arange(6), np.arange(6)]
print("对角线元素:", diagonal_elements)
输出结果:对角线元素: [ 0  7 99 99 28 35]

在这个示例中,使用Numpy的arange函数结合索引操作,提取出了矩阵的对角线元素。切片与数组复制在Numpy中,切片通常会返回原数组的视图(view),而不是数据的副本。这意味着对切片的修改会影响原数组。为了避免这种情况,可以显式地创建数组的副本。

数组视图与副本

# 创建一个数组视图

arr_view = arr_large[2:4, 2:4

]
arr_view[:] = 0
print("修改后的视图:\n", arr_view)
print("原始数组:\n", arr_large)

# 创建一个数组副本
arr_copy = arr_large[2:4, 2:4].copy()
arr_copy[:] = 99
print("修改后的副本:\n", arr_copy)
print("原始数组:\n", arr_large)
输出结果:修改后的视图:
 [[0 0]
  [0 0]]
原始数组:
 [[ 0  1  2  3  4  5]
  [ 6  7  8  9 10 11]
  [12 13  0  0 16 17]
  [18 19  0  0 22 23]
  [24 25 26 27 28 29]
  [30 31 32 33 34 35]]

修改后的副本:
 [[99 99]
  [99 99]]
原始数组:
 [[ 0  1  2  3  4  5]
  [ 6  7  8  9 10 11]
  [12 13  0  0 16 17]
  [18 19  0  0 22 23]
  [24 25 26 27 28 29]
  [30 31 32 33 34 35]]

在这个示例中,展示了视图和副本的区别。当修改视图时,原始数组也发生了变化;而当修改副本时,原始数组保持不变。

总结

本文深入探讨了Python Numpy库中的数组切片操作,展示了如何通过切片技术高效地提取数组子集和修改数组数据。详细介绍了一维、二维乃至高维数组的切片方法,并通过实际案例演示了切片的多种应用场景,如按步长切片、反向切片、提取对角线元素等。此外,还讨论了切片操作与数组视图和副本的关系,帮助理解和避免潜在的数据修改问题。掌握这些切片技巧,能够更加灵活地处理数据,提高数据分析的效率和准确性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • NeRF笔记
  • SpringBoot 基于iText 根据PDF模板动态生成文件
  • OSError: [E050] Can‘t find model ‘en_core_web_sm‘.
  • Python爬虫(一文通)
  • OverflowError: cannot convert float infinity to integer
  • Golang使用Quic-Go开源库实现Quic客户端和服务端
  • 企业数据治理之主数据---供应商主数据
  • Java核心API——io类缓冲流
  • 什么是杨氏模量
  • 22AP10 SS524 平替 海思HI3521DV200 可提供开发资料
  • IP-RDS-222、IP-PRZ-59-AM12、EG-TRZ-42-L、EG-TRZ-42-H比例减压阀放大器
  • Qt详解QHostInfo
  • 【python报错已解决】AttributeError: module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘
  • 对标GPT4o,智谱推出新一代基座大模型 GLM-4-Plus
  • JDBC和Mybatis中的批处理
  • CentOS从零开始部署Nodejs项目
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • IDEA 插件开发入门教程
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • java8 Stream Pipelines 浅析
  • Mac转Windows的拯救指南
  • python学习笔记-类对象的信息
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 大整数乘法-表格法
  • 聊聊hikari连接池的leakDetectionThreshold
  • 算法---两个栈实现一个队列
  • 王永庆:技术创新改变教育未来
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 小程序button引导用户授权
  • 最简单的无缝轮播
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​Java基础复习笔记 第16章:网络编程
  • ​secrets --- 生成管理密码的安全随机数​
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • #define 用法
  • #FPGA(基础知识)
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (全注解开发)学习Spring-MVC的第三天
  • (三)Honghu Cloud云架构一定时调度平台
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .Net MVC4 上传大文件,并保存表单
  • .NET的数据绑定
  • .Net环境下的缓存技术介绍
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • /bin/bash^M: bad interpreter: No such file ordirectory