做网站应该问客户什么需求,九年级上册信息技术做网站,自己做图片上传网站,嘉兴型网站系统总部数组基础
在使用导入 Numpy 时#xff0c;通常给其一个别名 “np”#xff0c;即 import numpy as np 。
数据类型
整数类型数组与浮点类型数组
为了克服列表的缺点#xff0c;一个 Numpy 数组只容纳一种数据类型#xff0c;以节约内存。为方便起见#xff0c;可将 Nu…数组基础
在使用导入 Numpy 时通常给其一个别名 “np”即 import numpy as np 。
数据类型
整数类型数组与浮点类型数组
为了克服列表的缺点一个 Numpy 数组只容纳一种数据类型以节约内存。为方便起见可将 Numpy 数组简单分为整数类型数组与浮点型数组。 输出 注意这个区别非常重要不能忽视。
另外使用 print 输出 Numpy 数组后元素之间没有逗号这有两个好处一是可以可将之与 Python 列表区分开来二是可以避免逗号与小数点之间的混淆。
同化定理
一个人的力量是无法改变全体的在实际操作中要注意
1、往整数类型数组里插入浮点数该浮点数会自动被截断为整数。 2、往浮点数类型数组里插入整数该整数会自动升级为浮点数。 输出 共同改变定理
同化定理告诉我们整数型数组和浮点型数组之间的界限非常严格那么如何将这两种数据类型的数组进行相互转化呢既然某一个人容易被集体所同化那只要全体共同改变自然就可以成功。
整数型数组和浮点型数组相互转换规范的方法是使用 .astype() 方法。 输出 除了上述方法以外只要满足共同改变定理整数型数组和浮点型数组仍然可以互相转换。最常见的是整数型数组在运算过程中升级为浮点型数组示例如下。 输出 整数型数组很好升级浮点型数组但浮点型数组在运算过程中一般不会降级。
数组维度
一维维度和二维数组
考虑到深度学习中三维及其以上的数组出现次数少我们后续主要讲解 Numpy 中的一维数组和二维数组学了一维和二维后很好类推到三维。
不同维度的数组之间从外形上的本质区别是 一维数组使用 1 层中括号表示 二维数组使用 2 层中括号表示 三维数组使用 3 层中括号表示。 有些函数需要传入数组的形状参数不同维度数组的形状参数为 一维数组的形状参数形如x 或 (x, ) 二维数组的形状参数形如(x, y) 三维数组的形状参数形如(x, y, z)。 现在以同一个序列进行举例 当数组有一层中括号如 [1 2 3]则其为一维数组其形状是 3 或 (3, ) 当数组有两层中括号如 [ [1 2 3] ]则其为二维数组其形状是 (1, 3) 当数组有三层中括号如 [ [ [1 2 3] ] ]则其为三维数组其形状是 (1, 1, 3)。 这里用一个后面要讲的 np.ones() 函数进行演示只因其刚好符合需要传入参数的形状。 输出 平时可以随时留意一下数组的维度通过中括号的数量后面有些函数比如数组的拼接函数需要两个数组是同维度的。
不同维度数组之间的转换
不管一维数组转二维数组还是二维数组转一维数组都要使用的是数组的重塑方法 .reshape() 该方法需要传入重塑后的形状shape参数。
这个方法神奇的是给定了其它维度的数值剩下一个维度可以填 -1让它自己去计算。比如把一个 5 行 6 列的矩阵重塑为 3 行 10 列的矩阵当列的参数 10 告诉它行的参数直接可以用 -1 来替代它会自动去用 30 除以 10 来计算。
演示将一维数组升级为二维数组 输出 这里给 .reshape() 传入的形状参数是 (1, -1) 正常情况下我们都肯定是 (1, 10)这里 (1, -1) 的含义是行的参数是 1 行列的参数是 -1 自己去除着算吧反过来也是一样的嗷。
接着演示将二维数组降级为一维数组。 输出 现在规定本文中将一维数组称为向量二维数组称为矩阵。
数组的创建
创建指定数组
当明确知道数组每一个元素的具体数值时可以使用 np.array() 函数将 Python 列表转换为 Numpy 数组。 输出 注意一维向量是最节省内存的而二维三维会逐渐使内存消耗变大。
特别是极端情况如 一万行一列 的这种情况是非常消耗内存的。
创建递增数组
递增数组使用 np.arange() 函数进行创建arange 全称是 array_range。 输出 如果想要创建递增的浮点数数组的化可以有下面两种技巧 输出 创建同值数组
需要创建同值数组时使用 np.zeros() 函数以及 np.ones() 函数如示例。 输出 示例中隐藏了一个细节两个函数输出的并不是整数型的数组这可能是为了避免插进去的浮点数被截断所以将其设定为浮点型数组。
创建随机数组
有时需要创建随机数组那么可以使用 np.random 系列函数如示例。 输出 数组的索引
访问数组元素
与 Python 列表一致访问 Numpy 数组元素时使用中括号索引由 0 开始。
访问向量 输出 访问矩阵 输出 花式索引
在上一小节访问单个元素时向量用 arr1[x]矩阵用 arr2[x, y] 。逗号在矩阵里用于区分行和列这一小节逗号新增一个功能且不会与矩阵里的逗号混淆。
向量的花式索引 输出 矩阵的花式索引 输出 根据以上示例花式索引也就是用向量来替代普通索引的行列元素且花式索引输出的仍然是一个向量。
普通索引用一层中括号而花式索引使用两层中括号。
访问数组切片
向量的切片
向量与列表切片的操作完全一致因此本页内容在 Python 基础中均有涉及。 输出 矩阵的切片 输出 提取矩阵的行
基于矩阵的切片功能我们可以提取其部分行。 输出 所以有时可能会看到诸如 arr[1][2] 这样的语法不必吃惊其实这只是先提取了第一行再提取该行中第二个元素。BTW这样的简便写法并不推荐最好规范的写。
提取矩阵的列
基于矩阵的切片功能我们可以提取其部分列。 输出 实际上也可以直接使用 reshape 进行矩阵列的提取这里只是介绍一下转置操作在 Numpy 中的用法。
数组切片仅是视图
数组切片仅仅只是视图
与 Python 列表和 Matlab 不同Numpy 数组的切片仅仅是原数组的一个视图。换言之Numpy 切片并不会创建新的变量。 输出 如果一个几百万条数据的数组每次切片时都创建一个新变量势必造成大量的内存浪费。因此Numpy的切片被设计为原数组的视图是极好的。
深度学习中为了节省内存将多次使用 arr[:] 表达式 来替代 arr 表达式 。
备份切片为新变量
如果真的需要为切片创建新变量这种情况是很稀少的使用 .copy() 方法。 输出 数组赋值仅是绑定
数组赋值仅仅是绑定
与 Numpy 数组的切片一样Numpy 数组完整的赋值给另一个数组也只是绑定。换言之Numpy 数组之间的赋值并不会创建新的变量示例如下。 输出 此特性的出现依然是为了节省内存破局的方法仍然与前面相同。
复制数组为新变量
如果真的需要赋给一个新数组使用 .copy() 方法。 输出 数组的变形
数组的转置
数组的转置方法为 .T其只对矩阵有效因此遇到向量要先将其转化为矩阵。
向量的转置 输出 矩阵的转置
行矩阵的转置刚演示了列矩阵的转置如示例所示。 输出 矩阵的转置如示例所示。 输出 数组的翻转
数组的翻转方法有两个一个是上下翻转的 np.flipud( ) 表示 up-down一个是左右翻转的 np.fliplr( )表示 left-right。其中向量只能使用 np.flipud( )在数学中向量并不是横着排的而是竖着排的。
向量的翻转 输出 矩阵的翻转 输出 数组的重塑
想要重塑数组的形状需要用到 .reshape( ) 方法。
前面说过给定了其他维度的数值剩下一个维度可以填-1让它自己去计算。比如把一个 5 行 6 列的矩阵重塑为 3 行 10 列的矩阵当列的参数 10 告诉它行的参数直接可以用-1 来替代它会自己去用 30 除以 10 来计算。
向量的变形 输出 矩阵的变形 输出 数组的拼接
向量的拼接
两个向量拼接将得到一个新的加长版向量。 输出 矩阵的拼接
两个矩阵可以按不同的维度进行拼接但拼接时必须注意维度的吻合。 输出 最后要说明的是向量和矩阵不能进行拼接必须先把向量升级为矩阵。
数组的分裂
向量的分裂
向量分裂将得到若干个更短的向量。 输出 np.split() 函数中给出的第二个参数 [2,8] 表示在索引 [2] 和索引 [8] 的位置截断。
矩阵的分裂
矩阵的分裂同样可以按不同的维度进行分裂出来的均为矩阵。 输出 数组的运算
数组与系数之间的运算
Python 基础中常用的运算符如表 5-1 所示NumPy 的运算符与之相同。 这里仅以矩阵为例向量与系数的操作与之相同。 输出 数组与数组之间的运算
同维度数组间的运算即对应元素之间的运算这里仅以矩阵为例向量与向量的操作与之相同。 输出 上述乘法运算中乘法是遵循对应元素相乘的你可以称之为“逐元素乘积”。
那么如何实现线性代数中的“矩阵级乘法”呢下一章节会介绍到相关函数。
广播
上一节是同形状数组之间的逐元素运算本节讲解不同形状的数组之间的运算。
本课件仅讨论二维数组之内的情况不同形状的数组之间的运算有以下规则
⚫ 如果是向量与矩阵之间做运算向量自动升级为行矩阵
⚫ 如果某矩阵是行矩阵或列矩阵则其被广播以适配另一个矩阵的形状。
向量被广播
当一个形状为(x,y)的矩阵与一个向量做运算时要求该向量的形状必须为 y运算时向量会自动升级成形状为(1,y)的行矩阵该形状为(1,y)的行矩阵再自动被广播为形状为(x,y)的矩阵这样就与另一个矩阵的形状适配了。 输出 列矩阵被广播
当一个形状为(x,y)的矩阵与一个列矩阵做运算时要求该列矩阵的形状必须为(x,1)该形状为(x,1)的列矩阵再自动被广播为形状为(x,y)的矩阵这样就与另一个矩阵的形状适配了。 输出 行矩阵与列矩阵同时被广播
当一个形状为(1,y)的行矩阵与一个形状为(x,1) 的列矩阵做运算时这俩矩阵都会被自动广播为形状为(x,y)的矩阵这样就互相适配了。 输出 数组的函数
矩阵乘积
⚫ 第五章也就是上一章中的乘法都是“逐元素相乘”这里介绍线性代数中的矩阵乘积本节只需要使用 np.dot( ) 函数。
⚫ 当矩阵乘积中混有向量时根据需求其可充当行矩阵也可充当列矩阵但混有向量时输出结果必为向量。
向量与向量的乘积
设两个向量的形状按前后顺序分别是 5 以及 5 。从矩阵乘法的角度有(1, 5)x(5, 1) (1, 1)因此输出的应该是形状为 1 的向量。 输出 向量与矩阵的乘积
设向量的形状是 5矩阵的形状是 (5,3) 。从矩阵乘法的角度有(1,5)x(5,3)(1,3)因此输出的应该是形状为 3 的向量。 输出 矩阵与向量的乘积
设矩阵的形状是 (3,5) 向量的形状是 5。从矩阵乘法的角度有(3,5)x(5,1)(3,1)因此输出的应该是形状为 3 的向量。 输出 矩阵与矩阵的乘积
设两个矩阵的形状按前后顺序分别是 (5,2) 以及 (2,8) 。从矩阵乘法的角度有(5,2)x(2,8)(5,8)因此输出的应该是形状为 (5,8) 的矩阵。 输出 数学函数
NumPy 设计了很多数学函数这里列举其中最重要、最常见的几个。 输出 聚合函数
聚合很有用这里用矩阵演示。向量与之一致但没有 axis 参数。以下在注释中介绍了 6 个最重要的聚合函数其用法完全一致仅演示其中 3 个。 输出 ⚫ 当 axis0 时最终结果与每一行的元素个数一致当 axis1 时最终结果与每一列的元素个数一致。
⚫ 考虑到大型数组难免有缺失值以上聚合函数碰到缺失值时会报错因此出现了聚合函数的安全版本即计算时忽略缺失值np.nansum( )、np.nanprod( ) 、np.nanmean( )、np.nanstd( )、np.nanmax( )、np.nanmin( )。
布尔型数组
除了整数型数组和浮点型数组还有一种有用的数组类型——布尔型数组。
创建布尔型数组
由于 NumPy 的主要数据类型是整数型数组或浮点型数组因此布尔型数组的产生离不开大于、大于等于、等于、不等号!、小于、小于等于。
首先我们将数组与系数作比较以产生布尔型数组示例如下。 输出 其次我们将同维数组作比较以产生布尔型数组示例如下。 输出 最后还可以同时比较多个条件。Python 基础里同时检查多个条件使用的与、或、非是 and、or、not。但 NumPy 中使用的与、或、非是 、 | 、 ~ 。 输出 布尔型数组中 True 的数量
有三个关于 Ture 数量的有用函数分别是 np.sum( )、np.any( )、np.all( )。
np.sum( )函数统计布尔型数组里 True 的个数。示例如下。 输出 在上面的示例中np.abs(arr) 1 可以替换为 (arr-1) (arr1) 。此外最终统计的数量为 6790其概率近似为 0.6827这符合统计学中的 3σ 准则。
np.any( )函数只要布尔型数组里含有一个及其以上的 True就返回 True。 输出 从结果来看arr1 与 arr2 里含有共同元素那就是 5。
np.all( )函数当布尔型数组里全是 True 时才返回 True示例如下。 输出 从结果来看尽管 3σ 准则告诉我们有 99.73%的考生成绩高于 290 分290通过500-3x70计算得到但仍然有最终成绩低于 250 分的裸考者。
布尔型数组作为掩码
若一个普通数组和一个布尔型数组的维度相同可以将布尔型数组作为普通数组的掩码这样可以对普通数组中的元素作筛选。给出两个示例。
第一个示例筛选出数组中大于、等于或小于某个数字的元素。 输出 注意这个矩阵进行掩码操作后退化为了向量。
第二个示例筛选出数组逐元素比较的结果。 输出 满足条件的元素所在位置
现在我们来思考一种情况假设一个很长的数组我想知道满足某个条件的元素们所在的索引位置此时使用 np.where( ) 函数。 输出 np.where( ) 函数的输出看起来比较怪异它是输出了一个元组。元组第一个元素是“满足条件的元素所在位置”第二个元素是数组类型可忽略掉。
从数组到张量
最后总结一下PyTorch 作为当前首屈一指的深度学习库其将 NumPy 的语法尽数吸收作为自己处理数组的基本语法且运算速度从使用 CPU 的数组进步到使用 GPU 的张量。
⚫ NumPy 和 PyTorch 的基础语法几乎一致具体表现为
① np 对应 torch ② 数组 array 对应张量 tensor ③ NumPy 的 n 维数组对应着 PyTorch 的 n 阶张量。
⚫ 数组与张量之间可以相互转换 数组 arr 转为张量 tsts torch.tensor(arr) 张量 ts 转为数组 arrarr np.array(ts)。