NumPy图解教程

news/2024/7/7 21:10:47

图片

NumPy是Python中用于数据分析、机器学习、科学计算的重要软件包。它极大地简化了向量和矩阵的操作及处理。Python的不少数据处理软件包依赖于NumPy作为其基础架构的核心部分(例如scikit-learn、SciPy、pandas和tensorflow)。除了数据切片和数据切块的功能之外,掌握NumPy也使得开发者在使用各数据处理库调试和处理复杂用例时更具优势。

图片

在本文中,将介绍NumPy的主要用法,以及它如何呈现不同类型的数据(表格,图像,文本等),这些经Numpy处理后的数据将成为机器学习模型的输入。

1. 数组

1.1. 创建数组

我们可以通过将python列表传入np.array()来创建一个NumPy数组(也就是强大的ndarray)。在下面的例子里,创建出的数组如右边所示,通常情况下,我们希望NumPy为我们初始化数组的值,为此NumPy提供了诸如ones(),zeros()和random.random()之类的方法。我们只需传入元素个数即可:

图片

一旦我们创建了数组,我们就可以用其做点有趣的应用了,文摘菌将在下文展开说明。

1.2. 数组的算术运算

让我们创建两个NumPy数组,分别称作data和ones:

图片

若要计算两个数组的加法,只需简单地敲入data + ones,就可以实现对应位置上的数据相加的操作(即每行数据进行相加),这种操作比循环读取数组的方法代码实现更加简洁。

图片

当然,在此基础上举一反三,也可以实现减法、乘法和除法等操作:

图片

许多情况下,我们希望进行数组和单个数值的操作(也称作向量和标量之间的操作)。比如:如果数组表示的是以英里为单位的距离,我们的目标是将其转换为公里数。可以简单的写作data * 1.6:

图片

NumPy通过数组广播(broadcasting)知道这种操作需要和数组的每个元素相乘。

1.3. 数组的切片操作

我们可以像python列表操作那样对NumPy数组进行索引和切片,如下图所示:

图片

1.4. 聚合函数

NumPy为我们带来的便利还有聚合函数,聚合函数可以将数据进行压缩,统计数组中的一些特征值:

图片

除了min,max和sum等函数,还有mean(均值),prod(数据乘法)计算所有元素的乘积,std(标准差),等等。上面的所有例子都在一个维度上处理向量。除此之外,NumPy之美的一个关键之处是它能够将之前所看到的所有函数应用到任意维度上。

2. 矩阵

2.1. 创建矩阵

我们可以通过将二维列表传给Numpy来创建矩阵。

np.array([[1,2],[3,4]])

图片

除此外,也可以使用上文提到的ones()、zeros()和random.random()来创建矩阵,只需传入一个元组来描述矩阵的维度:

图片

2.2. 矩阵的算术运算

对于大小相同的两个矩阵,我们可以使用算术运算符(+-*/)将其相加或者相乘。NumPy对这类运算采用对应位置(position-wise)操作处理:

2.2.1. 矩阵加减

图片

2.2.2. 行列数目不同的矩阵加减

对于不同大小的矩阵,只有两个矩阵的维度同为1时(例如矩阵只有一列或一行),我们才能进行这些算术运算,在这种情况下,NumPy使用广播规则(broadcast)进行操作处理:

图片

2.2.3. 矩阵点乘

与算术运算有很大区别是使用点积的矩阵乘法。NumPy提供了dot()方法,可用于矩阵之间进行点积运算:

图片

上图的底部添加了矩阵尺寸,以强调运算的两个矩阵在列和行必须相等。可以将此操作图解为如下所示:

图片

2.3. 矩阵的切片和聚合

索引和切片功能在操作矩阵时变得更加有用。可以在不同维度上使用索引操作来对数据进行切片。

图片

我们可以像聚合向量一样聚合矩阵:

图片

不仅可以聚合矩阵中的所有值,还可以使用axis参数指定行和列的聚合:

图片

2.4. 矩阵的转置和重构

处理矩阵时经常需要对矩阵进行转置操作,常见的情况如计算两个矩阵的点积。NumPy数组的属性T可用于获取矩阵的转置。

图片

在较为复杂的用例中,你可能会发现自己需要改变某个矩阵的维度。这在机器学习应用中很常见,例如模型的输入矩阵形状与数据集不同,可以使用NumPy的reshape()方法。只需将矩阵所需的新维度传入即可。也可以传入-1,NumPy可以根据你的矩阵推断出正确的维度:

图片

上文中的所有功能都适用于多维数据,其中心数据结构称为ndarray(N维数组)。

图片

很多时候,改变维度只需在NumPy函数的参数中添加一个逗号,如下图所示:

图片

2.5. 矩阵乘法

2.5.1. 逐元素矩阵乘法

使用函数np.multiply,下图显示了为获得结果矩阵而执行的乘法运算。

Numpy Matrix Multiply

import numpy as nparr1 = np.array([[1, 2],[3, 4]])
arr2 = np.array([[5, 6],[7, 8]])arr_result = np.multiply(arr1, arr2)print(arr_result)

输出

[[ 5 12][21 32]]

2.5.2.  矩阵乘积

import numpy as nparr1 = np.array([[1, 2],[3, 4]])
arr2 = np.array([[5, 6],[7, 8]])arr_result = np.matmul(arr1, arr2)print(f'Matrix Product of arr1 and arr2 is:\n{arr_result}')arr_result = np.matmul(arr2, arr1)print(f'Matrix Product of arr2 and arr1 is:\n{arr_result}')

输出

Matrix Product of arr1 and arr2 is:
[[19 22][43 50]]
Matrix Product of arr2 and arr1 is:
[[23 34][31 46]]

下图说明了结果数组中每个索引的矩阵乘积运算。 为简单起见,为每个索引取第一个数组的行和第二个数组的列。 然后乘以相应的元素,然后将它们相加以达到矩阵乘积值。

Numpy Matrix Product

2.6. 矩阵求逆

2.6.1. 矩阵求逆

import numpy as npa = np.array([[1, 2], [3, 4]]) # 初始化一个非奇异矩阵(数组)
print(np.linalg.inv(a)) # 对应于MATLAB中 inv() 函数# 矩阵对象可以通过 .I 更方便的求逆
A = np.matrix(a)
print(A.I)

2.6.2. 矩阵求伪逆

import numpy as np# 定义一个奇异阵 A
A = np.zeros((4, 4))
A[0, -1] = 1
A[-1, 0] = -1
A = np.matrix(A)
print(A)
# print(A.I) 将报错,矩阵 A 为奇异矩阵,不可逆
print(np.linalg.pinv(a))  # 求矩阵 A 的伪逆(广义逆矩阵),对应于MATLAB中 pinv() 函数

3. 公式应用示例

NumPy的关键用例是实现适用于矩阵和向量的数学公式。这也Python中常用NumPy的原因。例如,均方误差是监督机器学习模型处理回归问题的核心:

图片

在NumPy中可以很容易地实现均方误差:

图片

这样做的好处是,numpy无需考虑predictions与labels具体包含的值。文摘菌将通过一个示例来逐步执行上面代码行中的四个操作:

图片

预测(predictions)和标签(labels)向量都包含三个值。这意味着n的值为3。在我们执行减法后,我们最终得到如下值:

图片

然后我们可以计算向量中各值的平方:

图片

现在我们对这些值求和:

图片

最终得到该预测的误差值和模型质量分数。

4. 用NumPy表示日常数据

日常接触到的数据类型,如电子表格,图像,音频......等,如何表示呢?Numpy可以解决这个问题。

4.1. 表和电子表格

电子表格或数据表都是二维矩阵。电子表格中的每个工作表都可以是自己的变量。python中类似的结构是pandas数据帧(dataframe),它实际上使用NumPy来构建的。

图片

4.2. 音频和时间序列

音频文件是一维样本数组。每个样本都是代表一小段音频信号的数字。CD质量的音频每秒可能有44,100个采样样本,每个样本是一个-65535到65536之间的整数。这意味着如果你有一个10秒的CD质量的WAVE文件,你可以将它加载到长度为10 * 44,100 = 441,000个样本的NumPy数组中。想要提取音频的第一秒?只需将文件加载到我们称之为audio的NumPy数组中,然后截取audio[:44100]。

以下是一段音频文件:

图片

时间序列数据也是如此(例如,股票价格随时间变化的序列)。

4.3. 图像

图像是大小为(高度×宽度)的像素矩阵。如果图像是黑白图像(也称为灰度图像),则每个像素可以由单个数字表示(通常在0(黑色)和255(白色)之间)。如果对图像做处理,裁剪图像的左上角10 x 10大小的一块像素区域,用NumPy中的image[:10,:10]就可以实现。

这是一个图像文件的片段:

图片

如果图像是彩色的,则每个像素由三个数字表示 :红色,绿色和蓝色。在这种情况下,我们需要第三维(因为每个单元格只能包含一个数字)。因此彩色图像由尺寸为(高x宽x 3)的ndarray表示。

图片

4.4. 语言

如果我们处理文本,情况就会有所不同。用数字表示文本需要两个步骤,构建词汇表(模型知道的所有唯一单词的清单)和嵌入(embedding)。让我们看看用数字表示这个(翻译的)古语引用的步骤:“Have the bards who preceded me left any theme unsung?”

模型需要先训练大量文本才能用数字表示这位战场诗人的诗句。我们可以让模型处理一个小数据集,并使用这个数据集来构建一个词汇表(71,290个单词):

图片

然后可以将句子划分成一系列“词”token(基于通用规则的单词或单词部分):

图片

然后我们用词汇表中的id替换每个单词:

图片

这些ID仍然不能为模型提供有价值的信息。因此,在将一系列单词送入模型之前,需要使用嵌入(embedding)来替换token/单词(在本例子中使用50维度的word2vec嵌入):

图片

你可以看到此NumPy数组的维度为[embedding_dimension x sequence_length]。

在实践中,这些数值不一定是这样的,但我以这种方式呈现它是为了视觉上的一致。出于性能原因,深度学习模型倾向于保留批数据大小的第一维(因为如果并行训练多个示例,则可以更快地训练模型)。很明显,这里非常适合使用reshape()。例如,像BERT这样的模型会期望其输入矩阵的形状为:[batch_size,sequence_length,embedding_size]。

这是一个数字合集,模型可以处理并执行各种有用的操作。我留空了许多行,可以用其他示例填充以供模型训练(或预测)。

参考文献

numpy矩阵乘法_NumPy矩阵乘法_cunchi4221的博客-CSDN博客

这是我见过最好的NumPy图解教程! 

https://www.jb51.net/article/168508.htm 


http://lihuaxi.xjx100.cn/news/247648.html

相关文章

ORA-06502 when awr report produce

最近在生成一套系统的AWR报告时出现了如下报错:ORA-06502: PL/SQL: numeric or value error: character string buffer too small,然后生成AWR报告的过程就终止了,查看生成的AWR报告,发现报告时不完整的,AWR报告到Comp…

Mobileye REM地图

为什么需要高精地图 理论上来讲,可以在车载系统检测和获取所有道路信息(可行驶路径、车道优先级、红绿灯与车道的关联关系、车道与人行横道与红绿灯的关系等),但是目前的AI能力无法保证实现很高的MTBF(Mean Time Between Failures, 平均无故障时间)&…

matlab中rand函数使用

rand作用:产生(0,1)之间均匀分布的随机数和矩阵。主要由输入的参数决定。 randn作用:生成标准正态分布的伪随机数(均值为0,方差为1).语法和rand一样 语法作用xrand返回区间(0,1)内均…

iBatis自动生成的主键 (Oracle,MS Sql Server,MySQL)【转】

iBatis的sqlMap配置文件的selectKey元素有个type属性&#xff0c;可以指定pre或者post表示前生成(pre)还是后生成(post)。 Oracle设置 Xml代码 <!-- Oracle SEQUENCE --> <insert id"insertProduct-ORACLE" parameterClass"com.domain.Product&quo…

WSFC 仲裁模型选择

今天我们再来详细讨论下关于WSFC的仲裁模型&#xff0c;主要仲裁模型的优缺点&#xff0c;应该如何去思考选择最佳合适方案WSFC引入仲裁&#xff0c;主要有两个目的跟踪群集当前运作票数是否符合仲裁模型协定&#xff0c;如果低于最少允许节点&#xff0c;则决定关闭群集&#…

Golang 本地帮助文档

2019独角兽企业重金招聘Python工程师标准>>> godoc -http:8000 url: http://127.0.0.1:8000 转载于:https://my.oschina.net/koalaone/blog/169626

车载卫星导航

除了地图标准问题外&#xff0c;定位也是面临难题。地图和定位是一体的&#xff0c;没有高精度定位&#xff0c;高精度地图毫无意义。 有关无人车的定位有两种&#xff0c;一种称之为绝对定位&#xff0c;不依赖任何参照物和任何先验信息&#xff0c;直接给出无人车相对地球坐…

matlab中cell函数使用

cell为mtalab提供的一种数据类型。 语法&#xff1a;xcell(m,n) 表示创建m*n的cell类型数据。每个单元都是独立的&#xff0c;可以存储任何数据。 xcell(2,3) x{1,1}[1,3,4,5,6] x{1,2}[J,e,r,r,y] x{1,3}50 x{2,1}[4 5;6 7] x 23 cell 数组[15 double] Jerry [50][22 d…