• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于python:看图学NumPy掌握n维数组基础知识点看这一篇就够了

python 搞代码 4年前 (2022-02-20) 28次浏览 已收录 0个评论
文章目录[隐藏]

摘要:NumPy是Python的最重要的扩大程序库之一,也是入门机器学习编程的必备工具。国外有位程序员讲NumPy的根本运算以图解的形式写下来,让学习过程变得轻松乏味。

NumPy是Python的最重要的扩大程序库之一,也是入门机器学习编程的必备工具。然而对初学者来说,NumPy的大量运算办法十分难记。

最近,国外有位程序员讲NumPy的根本运算以图解的形式写下来,让学习过程变得轻松乏味。在Reddit机器学习社区公布不到半天就播种了500+赞。

上面就让咱们追随他的教程一起来学习吧!

教程内容分为向量 (一维数组)、矩阵 (二维数组)、三维与更高维数组3个局部。

Numpy数组与Python列表

在介绍正式内容之前,先让咱们先来理解一下Numpy数组与Python列表的区别。

乍一看,NumPy数组相似于Python列表。它们都能够用作容器,具备获取(getting)和设置(setting)元素以及插入和移除元素的性能。

两者有很多相似之处,以下是二者在运算时的一个示例:

和Python列表相比,Numpy数组具备以下特点:

更紧凑,尤其是在一维以上的维度;向量化操作时比Python列表快,但在开端增加元素比Python列表慢。

在开端增加元素时,Python列表复杂度为O(1),NumPy复杂度为O(N)

向量运算

向量初始化

创立NumPy数组的一种办法是从Python列表间接转换,数组元素的类型与列表元素类型雷同。

NumPy数组无奈像Python列表那样加长,因为在数组开端没有保留空间。

因而,常见的做法是定义一个Python列表,对它进行操作,而后再转换为NumPy数组,或者用np.zerosnp.empty初始化数组,预调配必要的空间:

有时咱们须要创立一个空数组,大小和元素类型与现有数组雷同:

实际上,所有用常量填充创立的数组的函数都有一个_like对应项,来创立雷同类型的常数数组:

在NumPy中,能够用arange或者linspace来初始化枯燥序列数组:

如果须要相似[0., 1., 2.]的浮点数组,能够更改arange输入的类型:arange(3).astype(float)。

然而有更好的办法:arange函数对数据类型敏感,如果将整数作为参数,生成整数数组;如果输出浮点数(例如arange(3.)),则生成浮点数组。

然而arange在解决浮点数方面并不是特地善于:

这是因为0.1对于咱们来说是一个无限的十进制数,但对计算机而言却不是。在二进制下,0.1是一个无穷小数,必须在某处截断。这就是为什么将小数局部加到步骤arange通常是一个不太好的办法:咱们可能会遇到一个bug,导致数组的元素个数不是咱们想要的数,这会升高代码的可读性和可维护性。

这时候,linspace会派上用场。它不受舍入谬误的影响,并始终生成要求的元素数。

出于测试目标,通常须要生成随机数组,NumPy提供随机整数、均匀分布、正态分布等几种随机数模式:

向量索引

一旦将数据存储在数组中,NumPy便会提供简略的办法将其取出:

下面展现了各式各样的索引,例如取出某个特定区间,从右往左索引、只取出奇数位等等。

但它们都是所谓的view,也就是不存储原始数据。并且如果原始数组在被索引后进行更改,则不会反映原始数组的扭转。

这些索引办法容许调配批改原始数组的内容,因而须要特地留神:只有上面最初一种办法才是复制数组,如果用其余办法都可能毁坏原始数据:

从NumPy数组中获取数据的另一种超级有用的办法是布尔索引,它容许应用各种逻辑运算符,来检索符合条件的元素:

留神:Python中的三元比拟3<=a<=5在NumPy数组中不起作用。

如上所述,布尔索引也会改写数组。它有两个常见的函数,别离是np.wherenp.clip

向量运算

算术运算是NumPy速度最引入瞩目的中央之一。NumPy的向量运算符已达到C++级别,防止了Python的慢循环。

NumPy容许像一般数字一样操作整个数组(加减乘除、整除、幂):

△ 和Python中一样,a//b示意div b(整除),x**n示意xⁿ

向量还能够与标量进行相似的运算,办法雷同:

大多数的数学函数都有NumPy对应项用于解决向量:

向量的点积、叉积也有运算符:

咱们也能够进行三角函数、反三角函数、求斜边运算:

数组能够四舍五入为整数:

△ floor取下界;ceil取上界;round为四舍六入五取偶

NumPy还能够执行以下根本的统计运算(最大最小值、平均值、方差、标准差):

不过排序函数的性能比Python列表对应函数更少:

搜寻向量中的元素

与Python列表相同,NumPy数组没有index办法。

  • 查找元素的一种办法是np.where(a==x)0,它既不优雅也不疾速,因为要查找的项须要从结尾遍历数组的所有元素。
  • 更快的形式是通过Numba中的next((i[0] for i, v in np.ndenumerate(a) if v==x), -1)来减速。
  • 一旦对数组进行排序,状况就会变得更好:v = np.searchsorted(a, x); return v if a[v]==x else -1的复杂度为O(log N),的确十分快,然而首先须要O(N log N)的排序工夫。

比拟浮点数

函数np.allclose(a, b)用于比拟具备给定公差的浮点数组:

  • np.allclose假如所有的比拟数字的等级是1个单位。例如在上图中,它就认为1e-9和2e-9雷同,如果要进行更粗疏的比拟,须要通过atol指定比拟等级1:np.allclose(1e-9, 2e-9, atol=1e-17) == False。
  • math.isclose进行比拟没有假如前提,而是基于用户给出的一个正当abs_tol值:math.isclose(0.1+0.2–0.3, abs_tol=1e-8) == True。

除此之外np.allclose在相对和绝对公差公式中还存在一些小问题,例如,对某些数存在allclose(a, b) != allclose(b, a)。这些问题已在math.isclose函数中失去解决。

矩阵运算

NumPy中已经有一个专用的类matrix,但当初已弃用,因而上面将交替应用矩阵和2D数组两个词。

矩阵初始化语法与向量类似:

这里须要双括号,因为第二个地位参数是为dtype保留的。

随机矩阵的生成也相似于向量的生成:

二维索引语法比嵌套列表更不便:

和一维数组一样,上图的view示意,切片数组实际上并未进行任何复制。批改数组后,更改也将反映在切片中。

axis参数

在许多操作(例如求和)中,咱们须要通知NumPy是否要跨行或跨列进行操作。为了应用任意维数的通用表示法,NumPy引入了axis的概念:axis参数实际上是所探讨索引的数量:第一个索引是axis=0,第二个索引是axis=1,等等。

因而在二维数组中,如果axis=0是按列,那么axis=1就是按行。

矩阵运算

除了一般的运算符(如+,-,,/,//和)以元素形式计算外,还有一个@*运算符可计算矩阵乘积:

在第一局部中,咱们曾经看到向量乘积的运算,NumPy容许向量和矩阵之间,甚至两个向量之间进行元素的混合运算:

行向量与列向量

从下面的示例能够看出,在二维数组中,行向量和列向量被不同地看待。

默认状况下,一维数组在二维操作中被视为行向量。因而,将矩阵乘以行向量时,能够应用(n,)或(1,n),后果将雷同。

如果须要列向量,则有转置办法对其进行操作:

可能从一维数组中生成二位数组列向量的两个操作是应用命令reshape重排和newaxis建设新索引:

这里的-1参数示意reshape主动计算第二个维度上的数组长度,None在方括号中充当np.newaxis的快捷方式,该快捷方式在指定地位增加了一个空axis。

因而,NumPy中总共有三种类型的向量:一维数组,二维行向量和二维列向量。这是两者之间显式转换的示意图:

依据规定,一维数组被隐式解释为二维行向量,因而通常不用在这两个数组之间进行转换,相应区域用灰色标出。

矩阵操作

连贯矩阵有两个次要函数:

这两个函数只重叠矩阵或只重叠向量时,都能够失常工作。然而当波及一维数组与矩阵之间的混合重叠时,vstack能够失常工作:hstack会呈现尺寸不匹配谬误。

因为如上所述,一维数组被解释为行向量,而不是列向量。解决办法是将其转换为列向量,或者应用column_stack主动执行:

重叠的逆向操作是决裂:

矩阵能够通过两种形式实现复制:tile相似于复制粘贴,repeat相似于分页打印。

特定的列和行能够用delete进行删除:

逆运算为插入:

append就像hstack一样,该函数无奈主动转置一维数组,因而再次须要对向量进行转置或增加长度,或者应用column_stack代替:

实际上,如果咱们须要做的就是向数组的边界增加常量值,那么pad函数就足够了:

Meshgrid

如果咱们要创立以下矩阵:

两种办法都很慢,因为它们应用的是Python循环。在MATLAB解决这类问题的办法是创立一个meshgrid

该meshgrid函数承受任意一组索引,mgrid仅是切片,indices只能生成残缺的索引范畴。fromfunction如上所述,仅应用I和J参数一次调用提供的函数。

然而实际上,在NumPy中有一种更好的办法。无需在整个矩阵上消耗存储空间。仅存储大小正确的矢量就足够了,运算规定将解决其余的内容:

在没有indexing=’ij’参数的状况下,meshgrid将更改参数的程序:J, I= np.meshgrid(j, i)—这是一种“ xy”模式,用于可视化3D图。

除了在二维或三维数组上初始化外,meshgrid还能够用于索引数组:

矩阵统计

就像之前提到的统计函数一样,二维数组承受到axis参数后,会采取相应的统计运算:

二维及更高维度中,argmin和argmax函数返回最大最小值的索引:

all和any两个函数也能应用axis参数:

矩阵排序

只管axis参数对下面列出的函数很有用,但对二维排序却没有帮忙:

axis绝不是Python列表key参数的代替。不过NumPy具备多个函数,容许按列进行排序:

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))]:按从左到右所有列顺次进行排序。

3、还有一个参数order,然而如果从一般(非结构化)数组开始,则既不疾速也不容易应用。

4、因为这个非凡的操作形式更具可读性和它可能是一个更好的抉择,这样做的pandas不易出错:

  • pd.DataFrame(a).sort_values(by=[2,5]).to_numpy():通过第2列再通过第5列进行排序。
  • pd.DataFrame(a).sort_values().to_numpy():通过从左向右所有列进行排序

高维数组运算

通过重排一维向量或转换嵌套的Python列表来创立3D数组时,索引的含意为(z,y,x)。

第一个索引是立体的编号,而后才是在该立体上的挪动:

这种索引程序很不便,例如用于保留一堆灰度图像:这a[i]是援用第i个图像的快捷方式。

然而此索引程序不是通用的。解决RGB图像时,通常应用(y,x,z)程序:前两个是像素坐标,最初一个是色彩坐标(Matplotlib中是RGB ,OpenCV中是BGR ):

这样,能够不便地援用特定像素:a[i,j]给出像素的RGB元组(i,j)。

因而,创立特定几何形态的理论命令取决于正在解决的域的约定:

显然,NumPy函数像hstack、vstack或dstack不晓得这些约定。其中硬编码的索引程序是(y,x,z),RGB图像程序是:

△RGB图像数组(为简便起见,上图仅2种颜色)

如果数据的布局不同,则应用concatenate命令重叠图像,并在axis参数中提供显式索引数会更不便:

如果不方便使用axis,能够将数组转换硬编码为hstack的模式:

这种转换没有理论的复制产生。它只是混合索引的程序。

混合索引程序的另一个操作是数组转置。查看它可能会让咱们对三维数组更加相熟。

依据咱们决定的axis程序,转置数组所有立体的理论命令将有所不同:对于通用数组,它替换索引1和2,对于RGB图像,它替换0和1:

乏味的是,(和惟一的操作模式)默认的axes参数颠倒了索引程序,这与上述两个索引程序约定都不相符。

最初,还有一个函数,能够在解决多维数组时节俭很多Python循环,并使代码更简洁,这就是爱因斯坦求和函数einsum

它将沿反复索引的数组求和。

最初,若要把握NumPy,能够前去GitHub上的我的项目——100NumPy练习题,验证本人的学习成绩。

本文分享自华为云社区《看图学NumPy:把握n维数组根底知识点,看这一篇就够了》,原文作者:HWCloudAI 。

点击关注,第一工夫理解华为云陈腐技术~


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于python:看图学NumPy掌握n维数组基础知识点看这一篇就够了

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址