第十一章 Numpy库
⭐本专栏旨在对Python的基础语法进行详解,精炼地总结语法中的重点,详解难点,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握python编程,同时为后续的数据分析,机器学习及深度学习的代码能力打下坚实的基础。
????本文已收录于Python基础系列专栏: Python基础系列教程 欢迎订阅,持续更新。
10.1 为什么要用Numpy
10.1.1 低效的Python for循环
【例】 求100万个数的倒数
%timeit :ipython中统计运行时间的魔术方法(多次运行取平均值)
实现相同计算,Numpy的运行速度是Python循环的25倍,产生了质的飞跃
10.1.2 Numpy为什么如此高效
Numpy 是由C语言编写的
1、编译型语言VS解释型语言
C语言执行时,对代码进行整体编译,速度更快
2、连续单一类型存储VS分散多变类型存储
(1)Numpy数组内的数据类型必须是统一的,如全部是浮点型,而Python列表支持任意类型数据的填充
(2)Numpy数组内的数据连续存储在内存中,而Python列表的数据分散在内存中
这种存储结构,与一些更加高效的底层处理方式更加的契合
3、多线程VS线程锁
Python语言执行时有线程锁,无法实现真正的多线程并行,而C语言可以
10.1.3 什么时候用Numpy
在数据处理的过程中,遇到使用“Python for循环” 实现一些向量化、矩阵化操作的时候,要优先考虑用Numpy
如: 1、两个向量的点乘
2、矩阵乘法
10.2 Numpy数组的创建
10.2.1 从列表开始创建
- 设置数组的数据类型
- 二维数组
10.2.2 从头创建数组
(1)创建长度为5的数组,值都为0
(2)创建一个2*4的浮点型数组,值都为1
(3)创建一个3*5的数组,值都为8.8
(4)创建一个3*3的单位矩阵
(5)创建一个线性序列数组,从1开始,到15结束,步长为2
(6)创建一个4个元素的数组,这四个数均匀的分配到0~1
(7)创建一个10个元素的数组,形成1~10^9的等比数列
(8)创建一个3*3的,在0~1之间均匀分布的随机数构成的数组
(9)创建一个3*3的,均值为0,标准差为1的正态分布随机数构成的数组
(10)创建一个3*3的,在[0,10)之间随机整数构成的数组
(11)随机重排列
(12)随机采样
- 按指定形状采样
- 按概率采样
10.3 Numpy数组的性质
10.3.1 数组的属性
1、数组的形状shape
2、数组的维度ndim
3、数组的大小size
4、数组的数据类型dtype
10.3.2 数组索引
1、一维数组的索引
2、多维数组的索引——以二维为例
注意:numpy数组的数据类型是固定的,向一个整型数组插入一个浮点值,浮点值会向下进行取整
10.3.3 数组的切片
1、一维数组——跟列表一样
2、多维数组——以二维为例
3、获取数组的行和列
4、切片获取的是视图,而非副本
注意:视图元素发生修改,则原数组亦发生相应修改
修改切片的安全方式:copy
10.3.4 数组的变形
注意:reshape返回的是视图,而非副本
一维向量转行向量
一维向量转列向量
多维向量转一维向量
flatten返回的是副本
ravel返回的是视图
reshape返回的是视图
10.3.5 数组的拼接
1、水平拼接——非视图
- hstack()
- c_
2、垂直拼接——非视图
- vstack()
- r_
10.3.6 数组的分裂
1、split的用法
2、hsplit的用法
3、vsplit的用法
10.4 Numpy四大运算
10.4.1 向量化运算
1、与数字的加减乘除等 可见整体进行了向量化的运算
2、绝对值、三角函数、指数、对数
(1)绝对值
(2)三角函数
(3)指数运算
(4)对数运算
3、两个数组的运算
10.4.2 矩阵运算
- 矩阵的转置
- 矩阵乘法
注意跟x*y的区别,x*y只是对应位置相乘
10.4.3 广播运算
规则
如果两个数组的形状在维度上不匹配
那么数组的形式会沿着维度为1的维度进行扩展以匹配另一个数组的形状。
10.4.4 比较运算和掩码
1、比较运算
2、操作布尔数组
3、将布尔数组作为掩码
作为掩码后,相应位置为True的就会被取出来,而相应位置为False的就会忽略
10.4.5 花哨的索引
1、一维数组
注意:结果的形状与索引数组ind一致
2、多维数组
10.5 其他Numpy通用函数
10.5.1 数值排序
- 产生新的排序数组
- 替换原数组
- 获得排序索引
10.5.2 最大最小值
10.5.3 数值求和、求积
- 按行求和
- 按列求和
- 全体求和
- 求积
10.5.4 中位数、均值、方差、标准差
- 中位数
- 均值
- 方差
- 标准差