0%

Python进阶

说是进阶,其实就讲了三个数据分析常用包: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. 定义

    1
    2
    3
    4
    5
    6
    7
    8
    x, 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\|')
  2. 常用函数

    • M.det():返回M的行列式
    • M.inv():返回矩阵的逆(如果存在)
    • M.T:返回转置
    • Eq(left, right):返回left = right这个方程
    • solve(eq, goal):对于eq这个方程(eq是个Eq对象),求解goal目标变量的取值
  3. 实战例子

    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
    35
    from 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)