导图社区 Python中NumPy库学习笔记
一图帮你搞懂NumPy库!根据编程“动物书”学习整理的Numpy笔记,供大家学习使用! NumPy是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
编辑于2020-10-03 17:39:50一图帮你搞懂NumPy库!根据编程“动物书”学习整理的Numpy笔记,供大家学习使用! NumPy是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
IMA Advanced Management Accounting,CIMA考试管理级等级中高级管理会计,同时也适用于自己对于管理会计内容的自学
IMA Advanced Management Accounting,CIMA考试管理级等级中高级管理会计,同时也适用于自己对于管理会计内容的自学
社区模板帮助中心,点此进入>>
一图帮你搞懂NumPy库!根据编程“动物书”学习整理的Numpy笔记,供大家学习使用! NumPy是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
IMA Advanced Management Accounting,CIMA考试管理级等级中高级管理会计,同时也适用于自己对于管理会计内容的自学
IMA Advanced Management Accounting,CIMA考试管理级等级中高级管理会计,同时也适用于自己对于管理会计内容的自学
Numpy
python中的数据类型
python基于C语言实现,每个对象都是伪C语言结构体,该结构体不仅包含其值,还包含其他信息
从python中创建数组
不同于Python列表,numpy要求数组必须包含同一类型的数据,如果数据类型不匹配,numpy会向上转换成统一的数据类型
如果需要指定数组的数据类型可以用dtype关键字,例如:np.array([1,2,3,4],dtype='float32')
不同于python列表,numpy数组可以被指定为多维的,例如:np.array(range(i,i+3) for i in [2,4,6])
从头创建数组
创建一个长度为10的数组,数组的值都是0
np.zeros(10, dtype=int)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
创建一个3×5的浮点型数组,数组的值都是1
np.ones((3, 5), dtype=float)
创建一个3×5的浮点型数组,数组的值都是3.14
np.full((3, 5), 3.14)
创建一个3×5的浮点型数组,数组的值是一个线性序列 # 从0开始,到20结束,步长为2 # (它和内置的range()函数类似)
np.arange(0, 20, 2)
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
创建一个5个元素的数组,这5个数均匀地分配到0~1
np.linspace(0, 1, 5)
array([ 0. , 0.25, 0.5 , 0.75, 1. ])
创建一个3×3的、在0~1均匀分布的随机数组成的数组
np.random.random((3, 3))
创建一个3×3的、均值为0、方差为1的 # 正态分布的随机数数组
np.random.normal(0, 1, (3, 3))
创建一个3×3的、[0, 10)区间的随机整型数组
np.random.randint(0, 10, (3, 3))
创建一个3×3的单位矩阵
np.eye(3)
创建一个由3个整型数组成的未初始化的数组 # 数组的值是内存空间中的任意值
np.empty(3)
array([ 1., 1., 1.])
Numpy标准数据类型
Numpy数组基础
数组的属性
种子值:用于保证随机生成的数组具有可预测性,相同的种子(seed值)所产生的随机数是相同的。如果不设置seed值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。
np.random.seed(0) # 设置随机数种子
维度nidm
x3.ndim
数组每个维度的大小 shape
x3.shape
数组的总大小 size
x3.size
数组的数据类型
x3.dtype
每个数组元素字节的大小
x3.itemsize
数组总字节的大小
x3.nbytes
数组的索引
和 Python列表一样,在一维数组中,你也可以通过中括号指定索引获取第 i 个值(从 0 开始计数)
为了获取数组的末尾索引,可以用负值索引:
在多维数组中,可以用逗号分隔的索引元组获取元素
也可以用以上索引方式修改元素值:x2[0, 0] = 12
和 Python 列表不同,NumPy 数组是固定类型的。这意味着当你试图将一个浮点 值插入一个整型数组时,浮点值会被截短成整型。并且这种截短是自动完成的,不会给你 提示或警告,所以需要特别注意这一点!
数组的切分
用切片(slice)符号获取子数组,切片 符号用冒号(:)表示
x[start:stop:step]
step用来表示每隔多少个,默认为1,每隔一个用2表示
多维切片也采用同样的方式处理,用冒号分隔。例如:
x2[:2, :3] # 两行,三列
获取数组的行和列
一种常见的需求是获取数组的单行和单列。你可以将索引与切片组合起来实现这个功能, 用一个冒号(:)表示空切片:
print(x2[:, 0]) # x2的第一列
在获取行时,出于语法的简介考虑,可以省略空的切片:
print(x2[0]) #等于x2[0, :]
仅限列为空切片时
非副本视图的子数组
那就是数组切片返回的是数组数据的视图,而不是数值数据的副本。这一点也是 NumPy 数组切片和 Python 列表切片的不同之处:在 Python 列表中,切片是值的副本。
数组切片内容改变,原数组的内容也会改变
创建数组的副本
通过copy()方法实现
x2_sub_copy = x2[:2, :2].copy()
数组的变形
通过reshape()函数实现
grid = np.arange(1, 10).reshape((3, 3))
那么原始数组的大小必须和变形后数组的大小一致。如果 满足这个条件,reshape 方法将会用到原始数组的一个非副本视图
数组的拼接和分裂
数组的拼接
np.concatenate
x = np.array([1, 2, 3]) y = np.array([3, 2, 1]) np.concatenate([x, y])
array([1, 2, 3, 3, 2, 1])
可以拼接多个数组
进行二位数组的拼接时,默认axis=0,即竖直方向拼接,如果指定axis=1则水平方向拼接
np.vstack垂直栈
np.hstack水平栈
np.dstack 将沿着第三个维度拼接数组
数组的分裂
np.split
N 分裂点会得到 N + 1 个子数组
np.vsplit
np.hsplit
np.dsplit 将数组沿着第三个维度分裂
Numpy数组的计算:通用函数
通用函数的介绍
NumPy 中的向量操作是通过通用函数实现的。通用函数的主要目的是对 NumPy 数组中的 值执行更快的重复操作。
通过通用函数用向量的方式进行计算几乎总比用 Python 循环实现的计算更加有效,尤其是 当数组很大时。只要你看到 Python 脚本中有这样的循环,就应该考虑能否用向量方式替换 这个循环。
分类
一元通用函数(unary ufunc)对单个输入操作
二元通用函数(binary ufunc)对两个输入操作
探索numpy通用函数
数组的运算
地板除法:两个整数相除结果只取整数; %运算:两个数相除,取余数
Numpy运算符
绝对值
python绝对值计算
numpy绝对值计算
对应的 NumPy 通用函数是 np.absolute,该函数也可以用别名 np.abs 来访问
通用函数也可以处理复数的绝对值,结果返回的是该复数的幅度
三角函数
首先定义一个角度数组
逆三角函数
对数和指数
指数
对数
指数运算的逆运算,即对数运算也是可用的。最基本的 np.log 给出的是以自然数为底数的 对数。如果你希望计算以 2 为底数或者以 10 为底数的对数,可以按照如下示例处理:
高级的通用函数特性
指定输出
在进行大量运算时,有时候指定一个用于存放运算结果的数组是非常有用的。不同于创建 临时数组,你可以用这个特性将计算结果直接写入到你期望的存储位置。所有的通用函数 都可以通过 out 参数来指定计算结果的存放位置:
这个特性也可以被用作数组视图,例如可以将计算结果写入指定数组的每隔一个元素的 位置:
如果这里写的是 y[::2] = 2 ** x,那么结果将是创建一个临时数组,该数组存放的是 2 ** x 的结果,并且接下来会将这些值复制到 y 数组中。对于上述例子中比较小的计 算量来说,这两种方式的差别并不大。但是对于较大的数组,通过慎重使用 out 参数 将能够有效节约内存。
聚合
二元通用函数有些非常有趣的聚合功能,这些聚合可以直接在对象上计算。一 个 reduce 方法会对给定的元素和操作重复执行,直至得到单个的结果。
在一些特殊情况中,NumPy 提供了专用的函数(np.sum、np.prod、np.cumsum、 np.cumprod ),它们也可以实现以上 reduce 的功能
外积
任何通用函数都可以用 outer 方法获得两个不同输入数组所有元素对的函数运算结 果。
Numpy的结构化数组
结构化数据
生成结构化数组
简写的字符串格式的代码可能看起来令人困惑,但是它们其实基于非常简单的规则。第一个(可选)字符是< 或者>,分别表示“低字节序”(little endian)和“高字节序”(bidendian),表示字节(bytes)类型的数据在内存中存放顺序的习惯用法。后一个字符指定的是数据的类型:字符、字节、整型、浮点型,等等)。最后一个字符表示该对象的字节大小。
数组的排序
numpy中的快速排序
np.sort
想在不修改原始输入数组的基础上返回一个排好序的数组
np.argsort
该函数返回的是原始数组排好序的索引值:
这里如果把排好序的索引值引入进去可以直接索引排序
沿着行或者列排序
NumPy 排序算法的一个有用的功能是通过axis 参数,沿着多维数组的行或列进行排序
需要记住的是,这种处理方式是将行或列当作独立的数组,任何行或列的值之间的关系将会丢失!
部分排序:分隔
np.partition 函数的输入是数组和数字K,输出结果是一个新数组,最左边是第K 小的值,往右是任意顺序的其他值,结果数组中前三个值是数组中最小的三个值,剩下的位置是原始数组剩下的值。在这两个分隔区间中,元素都是任意排列的。
花哨的索引
探索花哨的索引
让我们能够快速获得并修改复 杂的数组值的子数据集。
概念:通过传递一个索引数组来一次性获得多个数组元素
利用花哨的索引,结果的形状与索引数组的形状一致,而不是与被索引数组的形状一致
这里需要注意,结果的第一个值是X[0, 2],第二个值是X[1, 1],第三个值是X[2, 3]。 在花哨的索引中,索引值的配对遵循广播的规则。因此当我们将一个列向 量和一个行向量组合在一个索引中时,会得到一个二维的结果
组合索引
花哨的索引与其他索引方案结合形成更强大的索引操作
用花哨索引修改值
正如花哨的索引可以被用于获取部分数组,它也可以被用于修改部分数组
比较,掩码和布尔逻辑
和通用函数类似的比较操作
NumPy 还实现了如 <(小于)和 >(大于)的逐元素比 较的通用函数。这些比较运算的结果是一个布尔数据类型的数组。一共有 6 种标准的比较 操作:
和算术运算符一样,比较运算操作在 NumPy 中也是借助通用函数来实现的。例如当你写 x < 3 时,NumPy 内部会使用 np.less(x, 3)。这些比较运算符和其对应的通用函数如下 表所示。和算术运算通用函数一样,这些比较运算通用函数也可以用于任意形状、大小的数组
操作布尔数组
首先给定一个布尔数组
统计记录的个数
np.count_nonzero 函数
np.sum函数
在这个例子中,False 会被解释成 0,True 会被解释成 1
sum() 的好处是,和其他 NumPy 聚合函数一样,这个求和也可以沿着行或列进行:
快速检查任意或所有值是否为True
np.any()
np.all()
注意:Python 有内置的 sum()、any() 和 all() 函数, 这些函数在 NumPy 中有不同的语法版本。如果在多维数组上混用这两个版本,会导致失 败或产生不可预知的错误结果。因此,确保在以上的示例中用的都是 np.sum()、np.any() 和 np.all() 函数。
布尔运算符
np.bitwise_xor:异或,如果两个值不相同,则异或结果为1;如果两个值相同,则异或结果为0
将布尔数组作为掩码
使 用布尔数组作为掩码,通过该掩码选择数据的子数据集
现在返回的是一个一维数组,它包含了所有满足条件的值。换句话说,所有的这些值是掩 码数组对应位置为 True 的值。
使用关键字 and/or 与使用逻辑操作运算符 &/|
and 和 or 判断整个对象是真或假,而 & 和 | 是指每个对象中的比特位。当你使用 and 或 or 时,就等于让 Python 将这个对象当作整个布尔实体。在 Python 中, 所有非零的整数都会被当作是 True;当你对整数使用 & 和 | 时,表达式操作的是元素的比特,将 and 或 or 应用于组成该数字的每个比特
当你在 NumPy 中有一个布尔数组时,该数组可以被当作是由比特字符组成的,其中 1 = True、0 = False。这样的数组可以用上面介绍的方式进行 & 和 | 的操作,而用 or 来计算这两个数组时,Python 会计算整个数组对象的真或假,这会导致程序出错
同样,对给定数组进行逻辑运算时,你也应该使用 | 或 &,而不是 or 或 and,因此可以记住:and 和 or 对整个对象执行单个布尔运算,而 & 和 | 对一个对象的内 容(单个比特或字节)执行多个布尔运算。对于 NumPy 布尔数组,后者是常用的 操作。
数组的计算:广播
广播的介绍
广播可以简单理解为用于不同大 小数组的二进制通用函数(加、减、乘等)的一组规则。
对于同样大小的数组,二进制操作是对相应元素逐个计算,广播允许这些二进制操作可以用于不同大小的数组。例如,可以简单地将一个标量(可以 认为是一个零维的数组)和一个数组相加:
广播的规则
反例
聚合:最大值,最小值和其他值
数组的求和
python的求和方法
numpy的求和
最大值和最小值
python的最大值和最小值
Numpy的最大值和最小值
多维度的聚合
沿着行或者列的方向进行聚合,聚合函数还有一个参数,用于指定沿着哪个轴的方向进行聚合。例如,可以通过指定 axis=0 找到每一列的最小值(axis=1则是按照行的方向):
其他的聚合函数
NumPy 提供了很多其他聚合函数,大多数的聚合都 有对 NaN 值的安全处理策略(NaN-safe),即计算时忽略所有的缺失值,这些缺失值即特殊 的 IEEE 浮点型 NaN 值
np.percentile(a,p,axis=none,keepdims=False)
其中a代表数组,p代表百分位数,axis表示沿着计算百分位数的轴,keepdims表示是否保持维度不变