说是进阶,其实就讲了三个数据分析常用包:numpy、pandas、matplotlib
numpy
- 其实就是列表,但是好处就是速度快、操作方便、许多好用的数学计算接口
定义
- 通过列表定义
- a = [0, 1, 2, 3] arr = np.array(a)
- arr = np.array([0, 1, 2, 3])
- 初始化为全0/1/指定元素
- np.zeros(5) # 结果为array([0., 0., 0., 0., 0.])
- np.ones(5) # 结果为array([1., 1., 1., 1., 1.])
- .zeros和.ones默认都是小数,改为整数可以写.zeros(5, dtype='int')
- a.fill(3):将a的所有元素改为3(注意这里a要是一个ndarray类型)
- 生成整数数列
- np.arrange(l, r, d):在[l, r)内,从l开始,每次递增d
- 生成随机数
- np.random.rand(10):生成10个[0, 1)的随机数
- np.random.randn(10):生成10个服从标准正态分布的随机数
- np.random.randint(l, r, 10):生成10个在[l, r)范围内的随机整数
属性
- a.dtype:查看a里元素的类型
- a.shape:返回一个元组,里面元素分别代表每一维元素的数目
- a.ndim:查看维度
- a.size:查看元素个数
- a.astype('float'):返回将a内元素类型转换为float后的结果
运算
ndarray支持切片,同时可直接与数字/ndarray进行运算
注意复制的时候不能像列表那样用a[:]切片复制,要使用.copy()来复制
a + 1:每个元素+1
a * 5:每个元素*5
a + b:两个ndarray对应元素相加
a * b:两个ndarray对应元素相乘
a / b:两个ndarray对应元素相除
多维情况
np.zeros((2, 3)):创建2行3列的全零ndarray
np.ones((2, 3)):创建2行3列的全一ndarray
a.fill(3):将a全部元素换为3
a[1, 2]:访问第1行第2列的元素
a[1]:返回第一行,以ndarray形式
常用函数
- np.sort(a):返回将a排序后的结果
- np.argsort(a):返回每个元素在排序过后所处的排名(排名从0开始)
- np.sum(a):求和
- np.max(a):求最大值
- np.mean(a):求均值
- np.vstack((a, b)):纵向堆叠
- np.hstack((a, b)):横向堆叠
- np.dstack((a, b)):维度上堆叠
矩阵运算
a.T:转置
np.eye(3):产生一个3*3的单位矩阵
np.dot(a, b):返回俩矩阵相乘的结果
np.linalg.det(a):求矩阵的行列式
np.linalg.inv(a):求矩阵的逆矩阵
np.diagonal(a):提取矩阵的对角线元素,返回一个一维ndarray
np.diag(a):这里a是一个一维ndarray,返回一个以a为对角线元素的矩阵
矩阵只保留对角线元素:先np.digonal(),再np.diag()一下即可
pandas
- 提供了许多处理数据的接口
Series
- pd.Series([1, 3, 5, nan, 7]):创建一个Series,其实Series跟列表差不多,就是多了一个索引index。列表的索引就是下标0, 1, 2, ...,Series索引默认也是0, 1, 2,但是可以自己更改
- a.values:返回a的值
- a.index:返回a的键
DataFrame
- DataFrame其实就是一个二维数组,但是有表头。行表头叫做columns,列表头叫做index
- a = pd.read_excel('路径'):把一个excel表文件读入到一个dataframe变量中
- a.head():查看前5行
- a.tail():查看后5行
matplotlib
- matplotlib 是一个Python 的2D 图形包。pyplot封装了很多画图的函数。所以在实际的使用过程中,常常以plt 作为 matplotlib.pyplot 的省略。import matplotlib.pyplot as plt
- 找参数的网站:https://blog.csdn.net/qq_40481843/article/details/106231257
- plt.plot
- 画函数:plt.plot(x列表, y列表)
- 画线段:plt.plot([x1, x2], [y1, y2])
- 画点:plt.plot(x, y)
- 参数:
- color:颜色
- marker:点类型
- markersize:点大小
- markeredgewidth:点边宽
- fillstyle:点填充类型
- linestyle:线类型
- linewidth:线宽
- label:图例名字
- plt.xlabel / plt.title
- ' '里写名称,用$$括起来可写latex
- 参数:
- fontsize:字体大小
- plt.xlim:改变x轴范围,例如plt.xlim((x1, x2))
- plt.legend
- 啥都不写:以默认配置显示图例
- 参数:
- frameon:True/False(是否显示边框)
- loc:图例显示位置
- fontsize:图例字体大小
- plt.text
- plt.text(x, y, 'xxx')
- 参数:
- fontsize:字体大小
- ha:水平对齐方式
- left:文本左对齐于指定点
- center:文本居中对齐于指定点
- right:文本右对齐于指定点
- va:垂直对齐方式
- top:文本顶部对齐于指定点
- center:文本中部对齐于指定点
- bottom:文本底部对齐于指定点
- plt.savefig:保存图片,例如plt.savefig('fig.eps')
- plt.rcParams
- 改变图片大小(单位为英寸):plt.rcParams['figure.figsize']=(6.0,4.0) # 默认是(6, 4)
- 改变图片保存时清晰度:plt.rcParams['savefig.dpi'] = 100 # 默认是100
- 改变图片显示的清晰度:plt.rcParams['figure.dpi'] = 100 # 默认是100
- Note:改变dpi只对栅格图有效,矢量图无需设置dpi,清晰度都一样的
sympy
一般使用即from sympy import *。
启用美化打印:init_printing(use_unicode=True, use_latex=True)。(配合display使用而不是print)
矩阵相关
定义
1
2
3
4
5
6
7
8x, y, z = symbols('x y z')
v = Matrix([x, y, z])
M = Matrix([
[x, y, z],
[x, y, z],
[x, y, z]
])
v_norm = symbols('\|v\|')常用函数
- M.det():返回M的行列式
- M.inv():返回矩阵的逆(如果存在)
- M.T:返回转置
- Eq(left, right):返回left = right这个方程
- solve(eq, goal):对于eq这个方程(eq是个Eq对象),求解goal目标变量的取值
实战例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35from sympy import *
init_printing(use_unicode=True, use_latex=True)
rho = symbols('rho')
varrho = symbols('varrho')
L1, L2, L3 = symbols('L_1 L_2 L_3')
AI_norm = symbols('\|A-I\|')
IJ_norm = symbols('\|I-J\|')
beta = symbols('beta')
X = Matrix([
[1, 0, 0],
[0, rho, 0],
[0, L2 * varrho * AI_norm * IJ_norm + beta * (1 + rho), 1]
])
alpha = symbols('alpha')
mu = symbols('mu')
tau = symbols('tau')
E = Matrix([
[-1 * mu, L1, L3],
[varrho * L1 * L3 * (1 + tau * varrho * L3) * IJ_norm, varrho * L1 * L3 * IJ_norm, varrho * L3 * L3 * IJ_norm],
[varrho * L1 * L2 * (1 + varrho * L3) * (1 + tau * varrho * L3) * IJ_norm, varrho * L1 * L2 * (1 + varrho * L3) * IJ_norm, varrho * L2 * L3 * (1 + varrho * L3) * IJ_norm]
])
M = X + alpha * E
I = eye(3)
eq = Eq((I - M).det(), 0)
ans = solve(eq, alpha)
display(ans)