Python总结系列(二): 第三方库(科学计算相关)
0. 概述
一共包括三个第三方库:numpy,matplotlib,pandas
目的是入个门,以后慢慢看文档啥的
主要参考内容:Python for Data Analysis, 2nd Edition
1. Numpy
ndarray(array) 即多维数组,是 numpy 的核心概念,其有如下属性:
属性 | 作用 |
---|---|
ndarray.ndim | 多维数组的数组 |
ndarray.shape | 多维数组的形状 |
ndarray.size | 所有元素在内存中的大小 |
ndarray.dtype | 元素的数据类型 |
ndarray.itemsize | 每个元素的大小 |
ndarray.data | 数据缓冲区 |
数组中元素的数据类型参考:NumPy 数据类型
更详细的内容可以参考 Numpy 的教程:NumPy 基础
关羽 ndarray 的各种例程可以参考:Numpy routine
1.1 ndarray 的创建
常用的五种创建方法:
- 从 python 数据中创建
- 直接创建一些特殊的数组(全零,全一等)
- 从磁盘读取
- 从字节流创建
- 使用库函数创建
1.1.1 创建特殊数组
后缀为_like
的函数为根据给定的数组创建同形状的数组
函数 | 作用 |
---|---|
empty/empty_like | 未初始化数组 |
eye | 单位矩阵数组 |
ones/ones_like | 全 1 数组 |
zeros/zeros_like | 全 0 数组 |
full/full_like | 创建数组并填充给定内容 |
1.1.2 其他创建方法
最常用的方法就是从 python 的可迭代对象中创建
函数 | 作用 |
---|---|
array | 创建数组 |
asarray | 尽量不复制创建数组 |
frombuffer | 从字节流读取数组 |
fromfile | 从文件读取数组 |
fromstring | 从字符串创建数组 |
arange | 数组版 range |
1.2 ndarray 的运算
- 数组与标量进行运算,会用每个元素进行这个运算
- 相同形状数组之间的加减乘除,会转换成对应元素运算
- 相同形状数组之间比较,会生成布尔数组
不同形状的数组之间的运算会通过广播机制转换成相同形状的数组之间的运算:
广播会逐个检查各个维度,并在这个维度上进行广播:
- 如果当前维度两个数组的值相同,则无需广播
- 如果当前维度两个数组的值不同,且都不为 1,则无法广播触发错误
- 如果当前维度两个数组的值不同,但有一个为 1,则小数组沿着此维度运算时都用此维度上的第一组值
1.3 ndarray 索引与切片
和 python 中的切片类似,基本操作是一样的,所以部分内容略过
同时也有一些不同:
- numpy 中的切片不会复制数组的内容,而是创建一个引用(即视图)
通过逗号合并多级引用
arr2d[0][2]
和arr2d[0, 2]
是等价的布尔索引
1
2
3
4
5
6
7
8
9
10
11
12
13# 定义数据数组
data = np.random.randn(7, 4)
# 定义一个数组,其长度需要与目标数组被选择的维度长度相同
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
# 布尔索引数组
names == 'Bob'
# array([ True, False, False, True, False, False, False])
# 通过布尔索引内容
data[names=='Bob']
# array([[ 0.52414459, 1.54335133, 0.16256081, -0.15833941],
# [-0.62186793, 0.27771581, -0.61924424, 0.58594636]])花式索引
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24arr = np.empty((8, 4))
for i in range(8):
arr[i] = i
# 单个花式索引
# 负数为从末尾开始
arr[[4, 3, 0, 6]]
# array([[4., 4., 4., 4.],
# [3., 3., 3., 3.],
# [0., 0., 0., 0.],
# [6., 6., 6., 6.]])
# 多个花式索引
# 取两个坐标确定的点的元素
arr = np.arange(32).reshape((8, 4))
arr[[1, 5, 7, 2], [0, 3, 1, 2]]
array([ 4, 23, 29, 10])
# 结合逗号和花式索引
arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]
# array([[ 4, 7, 5, 6],
# [20, 23, 21, 22],
# [28, 31, 29, 30],
# [ 8, 11, 9, 10]])1.4 ndarray 的转置
一个多维的数组可以看成一个有多个轴的张量
其转置即轴的替换,而对于二维的张量(即矩阵),为对角交换
1 | arr = np.arange(16).reshape((2, 2, 4)) |
1.5 ndarray 的通用函数
通用函数可以看成是普通元素级函数的向量化包装
参考资料:ndarray 通用函数
部分函数如下:
一元函数 | 作用 |
---|---|
abs/fabs | 取绝对值 |
sqrt | 开方 |
square | 平方 |
exp | 自然指数幂 |
log/log10/log2/log1p | 各种对数 |
sign | 符号函数 |
ceil/floor | 计算上下整数 |
rint | 四舍五入 |
modf | 把小数和整数分成两个数组 |
isnan | 判断非数字(返回布尔数组) |
isfinite/isinf | 判断是否是无限 |
cos/cosh/sin/sinh/tan/tanh | 普通/双曲 三角函数 |
arcos/arcosh/… | 反三角函数 |
二元函数 | 作用 |
---|---|
add/subtract | 加减 |
multiply/divide | 乘除 |
foor_divide | 除后向下取整 |
power | 指数 |
maximum/fmax | 取最大 |
minimum/fmin | 取最小 |
mod | 元素级取余 |
copysign | 复制符号 |
比较与逻辑函数 | 作用 |
---|---|
greater/greater_equal/… | 比较操作 |
logical_and/… | 逻辑操作 |
1.6 ndarray 版三元表达式
python 本身是不支持三元表达式的,同时用 python 的 if-else 做又太慢(当数组元素非常多的时候)
ndarray 中有一个函数提供了三元表达式的功能:where
1 | # 对两个数组使用三元表达式 |
1.7 ndarray 统计方法
这些函数可以直接通过 ndarray 对象调用
函数 | 作用 |
---|---|
mean | 取平均(可指定轴) |
sum | 取和 |
std,var | 标准差和方差(可调自由度) |
min,max | 最小最大值 |
cumsum | 累计和 |
cumprod | 累计积 |
any | 布尔数组有任意一个值为 True(其他类型自动转化) |
all | 布尔数组所有值都为 True |
sort | 排序 |
1.8 ndarray 间操作
函数 | 作用 |
---|---|
unique(x) | 计算给定数组中的唯一元素,并返回有序结果 |
intersect1d(x,y) | 求两个给定数组的唯一交集,返回有序结果 |
union1d(x,y) | 求两个数组的唯一并集,返回有序结果 |
in1x(x,y) | 返回布尔数组,指定 x 中元素是否在 y 中 |
setdiff1d(x,y) | 在 x 中不在 y 中的元素 |
setxor1d(x,y) | 并集减交集 |
1.9 ndarray 的保存与读取
1 | # 保存数组到文件(会自动加上.npy扩展名) |
1.10 ndarray 线性代数
函数 | 作用 |
---|---|
diag | 矩阵求对角元素向量/向量转对角矩阵 |
dot | 矩阵乘法(可以用@符号简化) |
trace | 求对角元素之和 |
det | 求矩阵行列式 |
eig | 求本征值和本征向量 |
inv | 求矩阵的逆 |
pinv | 求矩阵的 Moore-Penrose 伪逆 |
qr | 求矩阵的 QR 分解 |
svd | 求奇异值分解 |
solve | 解线性方程 Ax=b,A 为矩阵 |
lstsq | 计算 Ax=b 的最小二乘解 |
1.11 伪随机数生成
参考资料:Numpy 随机数生成
numpy 的伪随机数与 python 本身的基本一致
通过RandomState
可以创建一个隔离的随机数生成器
1 | rng = np.random.RandomState(1234) |
随机生成器的状态
函数 | 作用 |
---|---|
get_state | 获取生成器的状态(一个元组) |
set_state | 设置生成器状态 |
随机数生成函数
函数 | 作用 |
---|---|
rand | 生成指定形状的数组 |
randn | 以正态分布生成指定形状的数组 |
randint | 生成整数 |
random_sample | 批量生成[0,1)的浮点数 |
choice | 从给定数组中生成随机数 |
bytes | 生成随机字节 |
shuffle | 打乱一个数组 |
permutation | 打乱一个数组或生成一个随机数组 |
根据指定分布生成随机样本:指定分布随机样本
2. Pandas
Pandas 是一个用来处理结构化数据的库,尤其擅长处理各种表格数据
其核心类有两个:一维数组Series
,表格型数组DataFrame
参考资料:
User Guide
User Guide 中文版
Api Reference
Api Reference 中文版
2.1 Series
Series 即一个一维数组,同时其每个元素对应一个索引(index).如果没有指定索引,Series 会自动生成一个从零开始的整型索引
1 | import pandas as pd |
2.2 DataFrame
DataFrame 是一个表格型的数据结构,可以先看成是多个共用索引的 Series 对象构成的字典
1 | import pandas as pd |
2.3 索引对象
索引对象即 Series 对象和 DataFrame 对象中索引
为了使得多个数据结构中可以共享同一个索引对象,索引对象内的元素是不可修改的
1 | import pandas as pd |
然后索引对象有一系列操作方法(类似 python 中的集合)
同时以下函数依然不会修改本身的元素,而是重新创造一个新的对象
函数 | 作用 |
---|---|
append | 连接集合 |
difference | 计算差集 |
intersection | 计算交集 |
union | 计算并集 |
isin | 计算索引中元素是否在目标中 |
delete | 删除指定位置元素 |
drop | 删除指定元素 |
insert | 在指定位置插入元素 |
is_monotonic | 查询是否递增 |
is_unique | 查询键是否唯一 |
unique | 合并重复项 |
2.4 重新索引
除了在初始化的时候进行索引,可以通过其他方法更改一个 Series/DataFrame 对象的索引(同时修改各个元素的顺序)
1 | import pandas as pd |
2.5 算术运算和数据对齐
一些算术运算时的基本规则
1 | import pandas as pd |
2.6 函数和映射
首先 Numpy 里的通用函数都可以作用到 Pandas 的对象里(参考 1.5)
然后 Pandas 对象可以根据函数对象对齐数据进行处理
1 | import pandas as pd |
2.7 数据排序
Series 和 DataFrame 分别由方法和``来进行排名和排序
sort_index
:根据索引名排序sort_values
:根据数据值排序rank
:数据排序不变,值变成原本数据的排名值
1 | import pandas as pd |
2.8 读写文本数据
关于不同格式的文本数据的读写方式,这不可能记得住,也没必要
在用到某个格式文件的时候直接参考下属资料即可
参考资料:
IO tools
IO tools 中文版
Input/output API reference
3. Matplotlib
Matplotlib 是一个画图库,这里只写一些常用的功能和对应的方法,细节可以查看参考资料
参考链接:
API 文档
教程
例程
3.1 基本使用
Matplotlib 画图后会阻塞当前程序,在 Ipython 和 jupyter notebook 中可以通过魔法命令来使其不阻塞
1 | # jupyter notebook |
matplotlib 最常用的方法
1 | import numpy as np |
3.2 细节调整
最好
函数 | 作用 |
---|---|
subplots_adjust | 调整 subplot 边距 |
legend | 设置图例标签 |
set_xticks | 设置 x 轴标签位置 |
set_xticklabels | 设置 x 轴标签名 |
set_yticks | 设置 y 轴标签位置 |
set_yticklabels | 设置 y 轴标签名 |
xlabel | 设置 x 轴名字 |
ylabel | 设置 y 轴名字 |
set_xlim | 设置 x 轴边界 |
set_ylim | 设置 y 轴边界 |
set_title | 设置图名 |
set | 传入具名参数设置图标 |
text | 在图上添加文字 |
annotate | 设置标注 |
add_patch | 在图上添加小图形 |
matplotlib.patches | 生成小图形 |
savefig | 保存图像 |
rc | 默认参数设置(run control) |