上面的例子都是处理一维向量。 NumPy 之美的关键在于它能够将上述所有方法应用于任意数量的维度。
创建矩阵
我们可以传递以下形状的列表,让 NumPy 创建一个矩阵来表示它:
np.array([[1,2],[3,4]])
我们还可以通过编写一个描述我们创建的矩阵维度的元组来使用上面提到的方法(ones()、zeros() 和 .()):
矩阵运算
如果两个矩阵大小相同,我们可以使用算术运算符(+-*/)来进行矩阵加法和乘法。 NumPy 将它们视为明智的操作:
我们也可以对两个不同大小的矩阵执行此类算术运算,但前提是其中一个维度为 1(例如只有一列或行的矩阵),在这种情况下,NumPy 使用广播规则来执行算术运算:
点乘
算术运算和矩阵运算之间的主要区别在于矩阵乘法使用点积。 NumPy 为每个矩阵分配一个 dot() 方法,我们可以使用该方法与其他矩阵执行点积运算:
我在上图右下角添加了矩阵维度,是为了强调这两个矩阵的相邻边必须具有相同的维度。 您可以将上述操作视为:
矩阵索引
当我们处理矩阵时,索引和切片操作变得更加有用:
矩阵聚合
我们可以像聚合向量一样聚合矩阵:
我们不仅可以聚合矩阵中的所有值,还可以使用 axis 参数进行跨行或列的聚合:
转置和重塑
处理矩阵时的一个常见需求是旋转矩阵。 当您需要执行两个矩阵的点积并对齐它们的共享维度时,通常需要转置。 NumPy 数组有一个方便的方法 T 来查找矩阵转置:
在更高级的实例中,您可能需要转换某些矩阵的维度。 在机器学习应用程序中,模型经常需要与数据集不同的输入形状。 在这些情况下,NumPy 的 () 方法就可以发挥作用。 只需为其分配矩阵所需的新维度即可。 您可以将 -1 分配给维度,NumPy 可以从矩阵推断出正确的维度:
更多维度
NumPy 可以在任意维度上实现上述所有内容。 它的中心数据结构无缘无故地被称为(N维数组)。
在许多情况下,处理新维度只需向 NumPy 函数的参数添加逗号即可:
实际使用情况
以下是 NumPy 可能提供的有用功能的示例演示。
公式
实现可用于矩阵和向量的数学公式是 NumPy 的一个关键用例。 这就是 NumPy 成为社区宠儿的原因。 比如均方误差公式,它是监督机器学习模型处理回归问题的核心:
在 NumPy 中实现这个公式很简单:
这样做的美妙之处在于,NumPy 并不关心它包含一个值还是一千个值(只要它们大小相同)。 我们可以通过一个例子依次执行上面这行代码中的四个操作:
预测向量和标签向量都包含三个值,即n的值为3。相减后得到的值如下:
然后对向量求平方得到:
现在对这些值求和:
结果是该预测的误差值和模型质量得分。
数据表示
考虑所有需要处理和建模的数据类型(电子表格、图像、音频等),其中许多数据类型适合用 n 维数组表示:
表格和电子表格
电子表格或数值表是二维矩阵。 电子表格中的每个工作表都可以是其自己的变量。 最流行的抽象是数据框,它实际上使用 NumPy 并构建在它的基础上。
音频和时间序列
音频文件是一维样本数组。 每个样本都是代表音频信号一小部分的数字。 CD 品质的音频每秒包含 44,100 个样本,其中每个样本都是 -65535 到 65536 之间的整数。这意味着如果您有一个 10 秒的 CD 品质的 WAVE 文件,则可以将其加载到长度为 10 * 的 NumPy 数组中44,100 = 441,000。 如果要提取音频的第一秒,只需将文件加载到音频 NumPy 数组中并获取audio[:44100]。
这是一个音频文件:
时间序列数据(例如一段时间内的股票价格)也是如此。
图像
图像是大小(高 x 宽)像素的矩阵。
如果图像是黑白的(即灰度),则每个像素可以用单个数字表示(通常在0(黑色)和255(白色)之间)。 想要从图像的左上角裁剪 10 x 10 像素?用 NumPy 编写
就是这样。
下图是图像文件的片段:
如果图像是彩色的,则每个像素由三个数字表示:红色、绿色和蓝色。 在这种情况下,我们需要一个三维数组(因为每个单元格只能包含一个数字)。 因此,彩色图像由尺寸(高度 x 宽度 x3)表示:
语言
如果我们处理文本,情况就不同了。 文本的数字表示需要词汇构建步骤(模型知道的唯一单词列表)和嵌入步骤。 让我们看看用数字表示以下文本的步骤:
该模型需要先查看大量文本,然后才能用数字表示诗人的话语。 我们可以让它与一个小数据集一起工作,并用它来构建词汇表(71,290 个单词):
这个句子可以被分割成一个标记数组(基于通用规则的单词或单词的一部分):
然后我们用词汇表中的 ID 替换每个单词:
这些 ID 仍然没有为模型提供太多信息价值。 因此,在将这组单词输入模型之前,我们需要用嵌入替换标记/单词(在本例中为 50 维嵌入):
正如你所看到的,这个 NumPy 数组的维度是 [x]。 出于性能原因,深度学习模型倾向于保留批量大小的第一个维度(因为如果并行训练许多示例,则模型训练得更快)。 在这种情况下,()就变得非常有用。 例如,像BERT这样的模型期望的输入形式是:[,,]。
现在这就是形式,模型可以处理它并采取相应的行动。 其他行留空,但填充了模型要训练(或预测)的其他示例。
原文链接:
深度专业版
详细理论| 工程实践| 行业分析|
机器之心最新深度内容栏目,总结AI深度好文章,对理论、工程、行业和应用进行详细讲解。 这里的每一篇文章都需要15分钟的深度阅读。
今日深度推荐
4D概览,核心开发人员全面解读内部机制
展望 CVPR 2019:一些学习主题示例
专访张博院士:AI奇迹难以再现,深度学习技术潜力已接近天花板
点击图片进入小程序深度专业版专栏