6.科学计算模块Numpy(3)对ndarray数组的常用操作

2024-09-06 23:04

本文主要是介绍6.科学计算模块Numpy(3)对ndarray数组的常用操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

众所周知,numpy能作为python中最受欢迎的数据处理模块,脱离不了它最核心的部件——ndarray数组。那么,我们今天就来了解一下numpy中对ndarray的常用操作。

通过阅读本篇博客你可以:

1.掌握ndarray数组的切片和copy

2.学会如何改变ndarray的数组维度

3.掌握数组的拼接

一、ndarray数组的切片和copy

1.ndarray数组的切片

ndarray对象的内容可以通过索引或切片来访问和修改,与Python中的list的切片操作一样。ndarray数组可以基于0-n的下标进行索引,并设置start,stop,step参数,从原数组中切割出一个新数组。

代码示例如下:

import numpy as np# 一维数组切片和索引的使用
x = np.arange(10)
print(x)  # [0 1 2 3 4 5 6 7 8 9]
y = x[2:9:2]
print(y)  # [2 4 6 8]
z = x[2:]
print(z)  # [2 3 4 5 6 7 8 9]

2.copy()

numpy.copy()可以用来复制ndarray数组。这个时候就有人要问了:“我们直接用切片或者说直接赋值给一个新变量来获取原数组不也同样可以做到复制的效果吗?”

这就是我们要讲的copy()普通切片赋值操作的区别。我们直接看下面的代码示例

import numpy as np# 直接切片赋值
arr = np.arange(10)
temp = arr[:3]
temp[0] = 100
print(arr)  # [100   1   2   3   4   5   6   7   8   9]# copy()复制
arr = np.arange(10)
temp = np.copy(arr[:3])
temp[0] = 100
print(arr)  # [0 1 2 3 4 5 6 7 8 9]

从上述的代码我们能看出来,直接切片赋值得到的temp变量,在改变了0索引之后,原数组arr也改变了0索引的值。而copy()复制得到的temp变量,在改变了0索引之后,原数组arr并没有改变0索引的值。这是由于直接切片赋值得到的temp变量与原数组arr共享同一块内存,属于浅拷贝。而copy()复制的temp变量是一个新的数组,属于深拷贝

结论:

①直接切片赋值对切片的修改会影响原始数组

②copy()复制对副本的修改不会影响原始数组

二、ndarray数组的维度改变

处理数组的一项重要工作就是改变数组的维度,包含提升数组的维度和降低数组的维度。numpy中封装了大量的方法用来改变数组的维度。

1.reshape()

使用numpy.reshape()函数,你可以将一个数组的形状转变为另一个形状,而不改变数组中的数据。

代码示例如下:

import numpy as np# 将一维数组改为 2 * 5 的二维数组
arr = np.arange(10)
res = arr.reshape(2, 5)
print(res)
"""[[0 1 2 3 4][5 6 7 8 9]]
"""

2.ravel()

numpy.ravel()可以将多维ndarray数组转换成一维数组。

代码示例如下:

import numpy as np# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)
"""[[1 2 3][4 5 6]]
"""
# 使用 ravel() 展平数组
flattened_arr = arr.ravel()
print(flattened_arr)  # [1 2 3 4 5 6]

3.flatten()

numpy.flatten()函数同numpy.ravel()一样可以将多维数组展平为一维数组。但是numpy.flatten()会返回一个展平后的副本,如果修改副本不会影响原数组。但numpy.ravel()是返回一个视图,修改展平后的视图会影响到原数组。

代码示例如下:

import numpy as np# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)
"""[[1 2 3][4 5 6]]
"""# 使用 flatten() 展平数组
flattened_arr = arr.flatten()
print(flattened_arr)  # [1 2 3 4 5 6]

三、ndarray数组的拼接

1.水平数组的组合

hstack()

numpy.hstack()函数用于多维数组的水平拼接,在拼接数组时沿着第一个轴(即横轴)进行操作,因此适用于二维数组的列拼接,也可以用于更高维度数组的横向拼接。

代码示例如下:

import numpy as np# 创建两个二维数组
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[7, 8, 9], [10, 11, 12]])# 使用 hstack() 进行水平拼接
result = np.hstack((arr1, arr2))
print(result)
"""[[ 1  2  3  7  8  9][ 4  5  6 10 11 12]]
"""

2.垂直数组的组合

vstack()

numpy.vstack()函数可以将多个数组沿着垂直方向拼接,在拼接数组时沿着第二个轴(即纵轴)进行操作,因此适用于二维数组的行拼接,也可以用于更高维度数组的纵向拼接。

代码示例如下:

import numpy as np# 创建两个二维数组
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[7, 8, 9], [10, 11, 12]])# 使用 vstack() 进行垂直拼接
result = np.vstack((arr1, arr2))
print(result)
"""[[ 1  2  3][ 4  5  6][ 7  8  9][10 11 12]]
"""

3.通用的数组的拼接

concatenate()

import numpy as np
np.concatenate((a0,a1,...,an),axis)

numpy.concatenate()函数可用于水平组合也可用于垂直组合。具体使用哪个方向取决于参数axis。如果参数axis = 0,则是垂直拼接;如果参数axis = 1,则是水平拼接。

代码示例如下:

import numpy as np# 创建三个二维数组
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[7, 8, 9], [10, 11, 12]])
arr3 = np.array([[13, 14, 15], [16, 17, 18]])# 沿着第一个轴(纵向)拼接
result_axis0 = np.concatenate((arr1, arr2, arr3), axis=0)
print(result_axis0)
"""[[ 1  2  3][ 4  5  6][ 7  8  9][10 11 12][13 14 15][16 17 18]]
"""# 沿着第二个轴(横向)拼接
result_axis1 = np.concatenate((arr1, arr2, arr3), axis=1)
print(result_axis1)
"""[[ 1  2  3  7  8  9 13 14 15][ 4  5  6 10 11 12 16 17 18]]
"""

总结 

本章博客介绍了numpy模块中多维数组的切片、维度的改变以及不同的拼接方法。希望可以对大家起到作用,谢谢。


关注我,内容持续更新(后续内容在作者专栏《从零基础到AI算法工程师》)!!!

这篇关于6.科学计算模块Numpy(3)对ndarray数组的常用操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143365

相关文章

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Java常用注解扩展对比举例详解

《Java常用注解扩展对比举例详解》:本文主要介绍Java常用注解扩展对比的相关资料,提供了丰富的代码示例,并总结了最佳实践建议,帮助开发者更好地理解和应用这些注解,需要的朋友可以参考下... 目录一、@Controller 与 @RestController 对比二、使用 @Data 与 不使用 @Dat

Mysql中深分页的五种常用方法整理

《Mysql中深分页的五种常用方法整理》在数据量非常大的情况下,深分页查询则变得很常见,这篇文章为大家整理了5个常用的方法,文中的示例代码讲解详细,大家可以根据自己的需求进行选择... 目录方案一:延迟关联 (Deferred Join)方案二:有序唯一键分页 (Cursor-based Paginatio