通俗图解NumPy数据处理方法

这篇教程详细介绍了NumPy的基础知识,包括向量和矩阵的初始化、索引、操作,以及数组的统计方法。重点讲解了如何创建和操作一维数组(向量)和二维数组(矩阵),如随机数组生成、向量点乘与叉乘、矩阵拼接、排序和统计函数的使用。此外,还提到了多维数组的处理和广播机制,以及einsum函数在多维数组操作中的应用。
摘要由CSDN通过智能技术生成


原文链接: https://www.yanxishe.com/TextTranslation/3198
个人认为也是一个很好的学习网站

1.向量-一维数组

1.1 初始化

1.1.1 向量初始化

在这里插入图片描述
注意:确保array中元素类型相同,不然dtype=‘object’

1.1.2 其他初始化向量方法

在这里插入图片描述

1.1.3 序列数组初始化

在这里插入图片描述

1.1.4 随机数组初始化

在这里插入图片描述

1.2 向量索引

对于数组来说可以通过访问数组索引来访问数组数据
在这里插入图片描述
上述所有这些方法都可以改变原始数组,即允许通过分配新值改变原数组的内容。这导致无法通过切片来复制数组:
在这里插入图片描述
此外,还可以通过布尔索引从NumPy数组中获取数据,这意味着可以使用各种逻辑运算符:
在这里插入图片描述
注意,不可以使用3 <= a <= 5这样的Python“三元”比较。
如上所述,布尔索引是可写的。如下图np.where和np.clip两个专有函数。
在这里插入图片描述

1.3 向量操作

在这里插入图片描述
浮点数的计算也是如此,numpy能够将标量广播到数组:
在这里插入图片描述
numpy提供了许多数学函数来处理矢量:
在这里插入图片描述
向量点乘(内积)和叉乘(外积、向量积)如下:
在这里插入图片描述
numpy也提供了如下三角函数运算:
在这里插入图片描述
数组整体进行四舍五入:
在这里插入图片描述
如上图知,floor向上取整,ceil向下取整,round四舍五入
数组最大最小值,最大最小值的索引:
在这里插入图片描述
在numpy中,排序函数功能有所阉割:
在这里插入图片描述

2.矩阵-二维数组

2.1 矩阵初始化

在这里插入图片描述
二维数组的索引语法要比嵌套列表更方便:
在这里插入图片描述

2.2 轴参数

在求和等操作中,NumPy可以实现跨行或跨列的操作。为了适用任意维数的数组,NumPy引入了axis的概念。axis参数的值实际上就是维度数量,如第一个维是axis=0 ,第二维是axis=1,依此类推。因此,在2维数组中,axis=0指列方向,axis=1指行方向。
在这里插入图片描述

2.3 行向量与列向量

在2维数组中,行向量和列向量被区别对待。通常NumPy会尽可能使用单一类型的1维数组(例如,2维数组a的第j列a[:, j]是1维数组)。默认情况下,一维数组在2维操作中被视为行向量,因此,将矩阵乘行向量时,使用形状(n,)或(1,n)的向量结果一致。有多种方法可以从一维数组中得到列向量,但并不包括transpose:
在这里插入图片描述
使用newaxis更新数组形状和索引可以将1维数组转化为2维列向量:
在这里插入图片描述
其中,-1表示在reshape是该维度自动决定,方括号中的None等同于np.newaxis,表示在指定位置添加一个空轴。

因此,NumPy中共有三种类型的向量:1维数组,2维行向量和2维列向量。以下是两两类型转换图:
在这里插入图片描述
组之间进行转换,对应图中阴影化区域。

严格来说,除一维外的所有数组的大小都是一个向量(如a.shape == [1,1,1,5,1,1]),因此numpy的输入类型是任意的,但上述三种最为常用。可以使用np.reshape将一维矢量转换为这种形式,使用np.squeeze可将其恢复。这两个功能都通过view发挥作用。

2.4 矩阵操作

矩阵的拼接有以下两种方式:
在这里插入图片描述
通过vstack才可实现,hstack会导致维度不匹配错误。因为前文提到将一维数组作为行向量,而不是列向量。为此,可以将其转换为行向量,或使用专门的column_stack函数执行此操作:
在这里插入图片描述
与stack对应的是split:
在这里插入图片描述
矩阵复制有两种方式:tile类似粘贴复制;repeat相当于分页打印。
在这里插入图片描述
delete可以删除特定的行或列:
在这里插入图片描述
相应插入操作为insert:
在这里插入图片描述
与hstack一样,append函数无法自动转置1D数组,因此需要重新调整向量形状或添加维数,或者使用column_stack:
在这里插入图片描述
如果仅仅是向数组的边界添加常量值,pad函数是足够的:
在这里插入图片描述

2.5 Meshgrids

广播机制使得meshgrids变得容易。例如需要下图所示(但尺寸大得多)的矩阵:
在这里插入图片描述
上述两种方法由于使用了循环,因此都比较慢。MATLAB通过构建meshgrid处理这种问题。
在这里插入图片描述
meshgrid函数接受任意一组索引,通过mgrid切片和indices索引生成完整的索引范围,然后,fromfunction函数根据I和J实现运算。

在NumPy中有一种更好的方法,无需在内存中存储整个I和J矩阵(虽然meshgrid已足够优秀,仅存储对原始向量的引用),仅存储形状矢量,然后通过广播规实现其余内容的处理:
在这里插入图片描述
如果没有indexing ='ij’参数,那么meshgrid将更改参数的顺序,即J,I=np.meshgrid(j,i)——一种用于可视化3D绘图的“ xy”模式(祥见该文档)。

除了在二维或三维网格上初始化函数外,网格还可以用于索引数组:
在这里插入图片描述

2.6 矩阵统计

就像sum函数,numpy提供了矩阵不同轴上的min/max, argmin/argmax, mean/median/percentile, std/var等函数。
在这里插入图片描述
p.amin等同于np.min,这样做同样是为了避免from numpy import *可能的歧义。

2维及更高维中的argmin和argmax函数分别返回最小和最大值的索引,通过unravel_index函数可以将其转换为二维坐标:
在这里插入图片描述
all和any同样也可作用于特定维度:
在这里插入图片描述

2.7 矩阵排序

虽然在前文中,axis参数适用于不同函数,但在二维数组排序中影响较小:
在这里插入图片描述
1、a[a [:,0] .argsort()]表示按第一列对数组进行排序:
在这里插入图片描述
其中,argsort返回排序后的原始数组的索引数组。
可以重复使用该方法,但千万不要搞混:

  • a = a[a[:,2].argsort()]
  • a = a[a[:,1].argsort(kind=‘stable’)]
  • a =a[a[:,0].argsort(kind=‘stable’)]
    在这里插入图片描述
    2、函数lexsort可以像上述这样对所有列进行排序,但是它总是按行执行,并且排序的行是颠倒的(即从下到上),其用法如下:

a[np.lexsort(np.flipud(a[2,5].T))],首先按第2列排序,然后按第5列排序;
a[np.lexsort(np.flipud(a.T))],从左到右依次排序各列。
在这里插入图片描述
其中,flipud沿上下方向翻转矩阵(沿axis = 0方向,与a [::-1,…]等效,其中…表示“其他所有维度”),注意区分它与fliplr,fliplr用于1维数组。

3、sort函数还有一个order参数,但该方法极不友好,不推荐学习。

4、在pandas中排序也是不错的选择,因为在pandas中操作位置确定,可读性好且不易出错:

  • pd.DataFrame(a).sort_values(by=[2,5]).to_numpy(),先按第2列排序,再按第5列排序。

-pd.DataFrame(a).sort_values().to_numpy(),按从左到右的顺序对所有列进行排序。

3.三维数组(更高数组)

通过重塑1维向量或转换嵌套Python列表来创建3维数组时,索引分别对应(z,y,x)。索引z是平面编号,(y,x)坐标在该平面上移动:
在这里插入图片描述
通过上述索引顺序,可以方便的保留灰度图像,a[i]表示第i个图像。

但这样的索引顺序并不具有广泛性,例如在处理RGB图像时,通常使用(y,x,z)顺序:首先是两个像素坐标,然后才是颜色坐标(Matplotlib中的RGB,OpenCV中的BGR):
在这里插入图片描述
这样可以方便地定位特定像素,如a[i,j]给出像素(i,j)的RGB元组。

因此,几何形状的创建实际取决于你对域的约定:
在这里插入图片描述
显然,hstack,vstack或dstack之类的NumPy函数并不一定满足这些约定,其默认的索引顺序是(y,x,z),RGB图像顺序如下:
在这里插入图片描述
如果数据不是这样的布局,使用concatenate命令可以方便的堆叠图像,并通过axis参数提供索引号:
在这里插入图片描述
如果不考虑轴数,可以将数组转换hstack和相应形式:
在这里插入图片描述
这种转换非常方便,该过程只是混合索引的顺序重排,并没有实际的复制操作。

通过混合索引顺序可实现数组转置,掌握该方法将加深你对3维数据的了解。根据确定的轴顺序,转置数组平面的命令有所不同:对于通用数组,交换索引1和2,对于RGB图像交换0和1:
在这里插入图片描述
注意,transpose(a.T)的默认轴参数会颠倒索引顺序,这不同于上述述两种索引顺序。

广播机制同样适用多维数组,更多详细信息可参阅笔记“ NumPy中的广播”。

最后介绍einsum(Einstein summation)函数,这将使你在处理多维数组时避免很多Python循环,代码更为简洁:
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

T1.Faker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值