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中的游标和触发器的使用方法,游标可以对查询结果集进行逐行处理,而触发器则可以在数据表发生更改时自动执行预定义的操作,感兴趣的朋友跟随小编一起看看... 目录游标游标的操作流程1. 定义游标2.打开游标3.利用游标检索数据4.关闭游标例题触发器触发器的基

在C#中分离饼图的某个区域的操作指南

《在C#中分离饼图的某个区域的操作指南》在处理Excel饼图时,我们可能需要将饼图的各个部分分离出来,以使它们更加醒目,Spire.XLS提供了Series.DataFormat.Percent属性,... 目录引言如何设置饼图各分片之间分离宽度的代码示例:从整个饼图中分离单个分片的代码示例:引言在处理

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

Python列表的创建与删除的操作指南

《Python列表的创建与删除的操作指南》列表(list)是Python中最常用、最灵活的内置数据结构之一,它支持动态扩容、混合类型、嵌套结构,几乎无处不在,但你真的会创建和删除列表吗,本文给大家介绍... 目录一、前言二、列表的创建方式1. 字面量语法(最常用)2. 使用list()构造器3. 列表推导式

Python使用Matplotlib和Seaborn绘制常用图表的技巧

《Python使用Matplotlib和Seaborn绘制常用图表的技巧》Python作为数据科学领域的明星语言,拥有强大且丰富的可视化库,其中最著名的莫过于Matplotlib和Seaborn,本篇... 目录1. 引言:数据可视化的力量2. 前置知识与环境准备2.1. 必备知识2.2. 安装所需库2.3

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

MyBatis配置文件中最常用的设置

《MyBatis配置文件中最常用的设置》文章主要介绍了MyBatis配置的优化方法,包括引用外部的properties配置文件、配置外置以实现环境解耦、配置文件中最常用的6个核心设置以及三种常用的Ma... 目录MyBATis配置优化mybatis的配置中引用外部的propertis配置文件⚠️ 注意事项X

MySQL基本表查询操作汇总之单表查询+多表操作大全

《MySQL基本表查询操作汇总之单表查询+多表操作大全》本文全面介绍了MySQL单表查询与多表操作的关键技术,包括基本语法、高级查询、表别名使用、多表连接及子查询等,并提供了丰富的实例,感兴趣的朋友跟... 目录一、单表查询整合(一)通用模版展示(二)举例说明(三)注意事项(四)Mapper简单举例简单查询

Nginx概念、架构、配置与虚拟主机实战操作指南

《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且... 目录Nginx 深度解析:概念、架构、配置与虚拟主机实战一、Nginx 的概念二、Nginx 的特点