当前位置: 首页 > 科技观察

DiagramingNumPy,以图形方式理解数组的教程

时间:2023-03-12 13:56:16 科技观察

NumPy包是Python生态系统中数据分析、机器学习和科学计算的主力。它极大地简化了向量和矩阵运算的处理。Python的一些主要软件包(例如scikit-learn、SciPy、pandas和tensorflow)使用NumPy作为其架构的基础部分。除了能够对数值数据进行切片和切块之外,使用NumPy还为操作和调试上述库中的高级示例提供了极大的便利。本文将介绍使用NumPy的一些主要方法,以及它如何在将数据输入机器学习模型之前表示不同类型的数据(表格、图像、文本等)。importnumpyasnp创建数组我们可以通过传递python列表并使用np.array()创建NumPy数组(很可能是多维数组)。本例中python创建的数组如下图右侧所示:通常我们希望NumPy初始化数组的值,为此NumPy提供了ones()、zeros()和random.random().我们只需传递我们希望NumPy生成的元素数量:一旦创建了数组,我们就可以随意操作它们。数组操作让我们创建两个NumPy数组来演示数组操作能力。我们将下图中的两个数组分别称为data和ones:按位置相加(即每一行对应相加),直接输入data+ones:当我开始学习这些工具的时候,我发现这样的抽象可以让我不必在循环中编写类似的计算。这样的抽象让我可以在更高的层次上思考。除了“加法”之外,我们还可以进行以下操作:通常,我们希望数组与单个数之间也可以进行运算(即向量与标量之间的运算)。假设我们有一个以英里为单位表示距离的数组,我们想将它们的单位转换为公里。Justtypedata*1.6:看看NumPy是怎么理解这个操作的?这个概念叫做广播,它非常有用。索引我们可以像切片python列表一样对NumPy数组进行任意索引和切片:聚合NumPy也提供了聚合函数:除了min、max和sum之外,还可以用mean求平均值,用prod求Product的所有元素,使用std获得标准偏差等。更多维度上面的示例都处理一维向量。NumPy之美的关键在于它能够将上述所有方法应用于任意数量的维度。1.创建一个矩阵我们可以传递一个如下形状的python列表让NumPy创建一个矩阵来表示它:np.array([[1,2],[3,4]])我们也可以使用提到的方法上面(ones(),zeros(),andrandom.random()),只需写一个元组来描述我们创建的矩阵的维度:2.矩阵运算如果两个矩阵大小相同,我们可以使用算术运算符(+-*/)添加和乘以矩阵。NumPy将它们视为位置运算:我们也可以对两个不同大小的矩阵执行此类算术运算,但前提是其中一个维度为1(例如只有一列或一行的矩阵),在这种情况下NumPyArithmetic运算使用广播规则执行:3.点积算术运算和矩阵运算之间的一个主要区别是矩阵乘法使用点积。NumPy为每个矩阵分配了一个dot()方法,我们可以使用它来与其他矩阵进行点乘:我在上图的右下角添加了矩阵维数,以强调这两个矩阵的相邻边必须相同维数。您可以将上述操作视为:4.矩阵索引当我们处理矩阵时,索引和切片操作变得更加有用:5.矩阵聚合我们可以像聚合向量一样聚合矩阵:我们不仅可以聚合所有值在矩阵中,也可以使用轴参数执行跨行或列的聚合:6.转置和重塑处理矩阵时的一个常见需求是旋转矩阵。当您需要执行两个矩阵的点积并??对齐它们的共享维度时,通常需要转置。NumPy数组有一个方便的方法T来查找矩阵转置:在更高级的实例中,您可能需要转换特定矩阵的维度。在机器学习应用程序中,模型经常需要与数据集不同的输入形状。在这些情况下,NumPy的reshape()方法可以发挥作用。只需为其分配矩阵所需的新维度即可。您可以将-1的值分配给一个维度,NumPy可以从您的矩阵中推断出正确的维度:有了更多的维度,NumPy可以在任何维度上完成上述所有事情。它的中心数据结构被无缘无故地称为ndarray(N维数组)。在许多情况下,处理新维度只是在NumPy函数的参数中添加一个逗号:实际用法下面是一个实用示例,说明可以使用NumPy实现的有用功能。1.公式实现适用于矩阵和向量的数学公式是NumPy的一个关键用例。这就是为什么NumPy是Python社区的宠儿。例如,均方误差公式,它是用于回归问题的监督式机器学习模型的核心:它很容易在NumPy中实现:这样做的好处是NumPy不关心预测和标签是否包含一个值或一千个值(只要它们大小相同)。我们可以举个例子,依次执行上面一行中的四个操作:预测和标签向量都包含三个值,即n的值为3。相减后,得到的值如下:然后将矢量平方为:现在对这些值求和:结果是该预测的误差值和模型质量得分。2.数据表示考虑所有需要处理和建模的数据类型(电子表格、图像、音频等),其中许多适合在n维数组中表示:(1)表格和电子表格电子表格或值表都是二维矩阵。电子表格中的每个工作表都可以是它自己的变量。python中最流行的抽象是pandas数据框,它实际上使用NumPy并构建在它之上。(2)音频和时间序列音频文件是样本的一维数组。每个样本都是一个数字,代表音频信号的一小部分。CD质量的音频每秒包含44,100个样本,每个样本是一个介于-65535和65536之间的整数。这意味着如果你有一个10秒的CD质量的WAVE文件,你可以将它加载到一个长度为10*的NumPy数组中44,100=441,000。如果要提取音频的第一秒,只需将文件加载到音频NumPy数组中并获取audio[:44100]。这是一个音频文件:时间序列数据也是如此(比如一段时间内的股票价格)。(3)图像图像是大小为(高x宽)的像素矩阵。如果图像是黑白的(即灰度),每个像素可以用一个数字表示(通常在0(黑色)和255(白色)之间)。想要裁剪图像左上角的10x10像素?用NumPy编写。下图是图像文件的片段:如果图像是彩色的,则每个像素由三个数字表示-红色、绿色和蓝色。在这种情况下,我们需要一个三维数组(因为每个单元格只能包含一个数字)。因此彩色图像由大小为(高x宽x3)的ndarray表示:(4)语言如果我们处理文本,情况就不同了。文本的数字表示需要一个词汇构建步骤(模型知道的唯一单词列表)和一个嵌入步骤。让我们看一下用数字表示以下文本的步骤:在用数字表示诗人的话语之前,模型需要查看大量文本。我们可以让它与一个小数据集一起工作,并用它来构建一个词汇表(71,290个单词):句子可以分成一个标记数组(基于通用规则的单词或单词的一部分):然后我们使用ID替换每个word:这些ID仍然没有为模型提供太多信息价值。因此,在将这组单词输入模型之前,我们需要用嵌入替换标记/单词(在本例中为50维word2vec嵌入):如您所见,此NumPy数组的维度为[embedding_dimensionxsequence_length].出于性能原因,深度学习模型倾向于保留批量大小的第一个维度(因为如果并行训练许多示例,模型训练速度会加快)。在这种情况下,reshape()变得非常有用。例如,像BERT这样的模型需要以下形式的输入:[batch_size,sequence_length,embedding_size]。现在这是模型可以处理并采取相应行动的数字量的形式。其他行留空,但它们填充了供模型训练(或预测)的其他示例。原文链接:https://jalammar.github.io/visual-numpy/【本文为《机器之心》专栏原文翻译,微信公众号《机器之心(id:almosthuman2014)》】点此查看该作者更多好文