zoukankan      html  css  js  c++  java
  • 壹拾捌

    Python常用模块

    一、numpy模块

    ​ numpy是Python的一种开源的数值计算扩展库。这种库可用来存储和处理大型numpy数组,比Python自身的嵌套列表结构要高效的多(该结构也可以用来表示numpy数组)。

    ​ numpy库有两个作用:

    1. 区别于list列表,提供了数组操作、数组运算、以及统计分布和简单的数学模型
    2. 计算速度快,甚至要由于python内置的简单运算,使得其成为pandas、sklearn等模块的依赖包。高级的框架如TensorFlow、PyTorch等,其数组操作也和numpy非常相似。
    import numpy as np
    
    print(np.array([1,2,3]))
    print(np.array([[1,2,3],[4,5,6]]))
    
    [1 2 3]
    [[1 2 3]
     [4 5 6]]
    

    ​ 数组的转置

    print(arr.T)
    [[1. 4.]
     [2. 5.]
     [3. 6.]]
    

    ​ 数组元素的数据类型

    print(arr.dtype)
    float32
    

    ​ 数组元素的个数

    print(arr.size)
    6
    

    ​ 数组的维度数

    print(arr.ndim)
    2
    

    ​ 数组维度的大小(组元)

    print(arr.shape)
    (2,3)
    

    ​ 获取numpy数组的行

    print(arr.shape[0]
    2
    

    ​ 获取numpy数组的列

    print(arr.shape[1])
    3
    

    ​ 取出所有元素

    arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
    print(arr[:, :])
    [[ 1  2  3  4]
     [ 5  6  7  8]
     [ 9 10 11 12]]
    

    ​ 取第一行的所有元素

    print(arr[:1, :])
    [[1 2 3 4]]
    

    ​ 取第一列的所有元素

    print(arr[:, :1])
    [[1]
     [5]
     [9]]
    

    ​ 取第一行第一列的元素

    print(arr[0, 0])
    1
    

    ​ 取大于5的元素,返回一个数组

    print(arr[arr > 5])
    [ 6  7  8  9 10 11 12]
    

    ​ 取第一行的所有元素,并且让第一行的元素都为0

    arr1 = arr.copy()
    arr1[:1, :] = 0
    print(arr1)
    [[ 0  0  0  0]
     [ 5  6  7  8]
     [ 9 10 11 12]]
    

    ​ 取所有大于5的元素,并且让大于5的元素为0

    arr2 = arr.copy()
    arr2[arr > 5] = 0
    print(arr2)
    [[1 2 3 4]
     [5 0 0 0]
     [0 0 0 0]]
    

    ​ 对numpy数组清零

    arr3 = arr.copy()
    arr3[:, :] = 0
    print(arr3)
    

    ​ 合并两个numpy数组的行,注意使用hstack()方法合并numpy数组,numpy数组应该有相同的行,其中hstack的h表示horizontal水平的

    arr1 = np.array([[1, 2], [3, 4], [5, 6]])
    arr2 = np.array([[7, 8], [9, 10], [11, 12]])
    print(np.hstack((arr1, arr2)))
    print(np.concatenate((arr1, arr2), axis=1))
    [[ 1  2  7  8]
     [ 3  4  9 10]
     [ 5  6 11 12]]
    

    ​ 合并两个numpy数组的列,注意使用vstack()方法合并numpy数组,numpy数组应该有相同的列,其中vstack的v表示vertical垂直的

    arr1 = np.array([[1, 2], [3, 4], [5, 6]])
    arr2 = np.array([[7, 8], [9, 10], [11, 12]])
    print(np.vstack((arr1, arr2)))
    print(np.concatenate((arr1, arr2), axis=0))
    [[ 1  2]
     [ 3  4]
     [ 5  6]
     [ 7  8]
     [ 9 10]
     [11 12]]
    
    方法 详解
    array() 将列表转换为数组,可选择显式指定dtype
    arange() range的numpy版,支持浮点数
    linspace() 类似arange(),第三个参数为数组长度
    zeros() 根据指定形状和dtype创建全0数组
    ones() 根据指定形状和dtype创建全1数组
    eye() 创建单位矩阵
    empty() 创建一个元素全随机的数组
    reshape() 重塑形状
    运算符 说明
    + 两个numpy数组对应元素相加
    - 两个numpy数组对应元素相减
    * 两个numpy数组对应元素相乘
    / 两个numpy数组对应元素相除,如果都是整数则取商
    % 两个numpy数组对应元素相除后取余数
    **n 单个numpy数组每个元素都取n次方,如**2:每个元素都取平方
    np.sin(arr) 对numpy数组arr中每个元素取正弦,sin(x)sin(x)
    np.cos(arr) 对numpy数组arr中每个元素取余弦,cos(x)cos(x)
    np.tan(arr) 对numpy数组arr中每个元素取正切,tan(x)tan(x)
    np.arcsin(arr) 对numpy数组arr中每个元素取反正弦,arcsin(x)arcsin(x)
    np.arccos(arr) 对numpy数组arr中每个元素取反余弦,arccos(x)arccos(x)
    np.arctan(arr) 对numpy数组arr中每个元素取反正切,arctan(x)arctan(x)
    np.exp(arr) 对numpy数组arr中每个元素取指数函数,exex
    np.sqrt(arr) 对numpy数组arr中每个元素开根号x−−√

    ​ 数组的逆

    arr = np.array([[1, 2, 3], [4, 5, 6], [9, 8, 9]])
    print(np.linalg.inv(arr))
    [[ 0.5        -1.          0.5       ]
     [-3.          3.         -1.        ]
     [ 2.16666667 -1.66666667  0.5       ]]
    

    ​ 数组数学和统计方法

    方法 详解
    sum 求和
    cumsum 累加求和
    mean 求平均数
    std 求标准差
    var 求方差
    min 求最小值
    max 求最大值
    argmin 求最小值索引
    argmax 求最大值索引
    sort 排序

    ​ 生成随机数

    函数名称 函数功能 参数说明
    rand(d0,d1,⋯,dnd0,d1,⋯,dn) 产生均匀分布的随机数 dndn为第n维数据的维度
    randn(d0,d1,⋯,dnd0,d1,⋯,dn) 产生标准正态分布随机数 dndn为第n维数据的维度
    randint(low[, high, size, dtype]) 产生随机整数 low:最小值;high:最大值;size:数据个数
    random_sample([size]) 在[0,1)[0,1)内产生随机数 size为随机数的shape,可以为元祖或者列表
    choice(a[, size]) 从arr中随机选择指定数据 arr为1维数组;size为数组形状
    uniform(low,high [,size]) 给定形状产生随机数组 low为最小值;high为最大值,size为数组形状
    shuffle(a) 与random.shuffle相同 a为指定数组

    二、pandas模块

    ​ pandas基于Numpy,可以看成是处理文本或者表格数据。pandas中有两个主要的数据结构,其中Series数据结构类似于Numpy中的一维数组,DataFrame类似于多维表格数据结构。

    pandas是python数据分析的核心模块。它主要提供了五大功能:

    1. 支持文件存取操作,支持数据库(sql)、html、json、pickle、csv(txt、excel)、sas、stata、hdf等。
    2. 支持增删改查、切片、高阶函数、分组聚合等单表操作,以及和dict、list的互相转换。
    3. 支持多表拼接合并操作。
    4. 支持简单的绘图操作。
    5. 支持简单的统计分析操作。

    ​ Series是一种类似于一维数组的对象,由一组数据和一组与之相关的数据标签(索引)组成。

    ​ Series比较像列表(数组)和字典的结合体。

    详解 方法
    从ndarray创建Series Series(arr)
    与标量运算 df*2
    两个Series运算 df1+df2
    索引 df[0], df[[1,2,4]]
    切片 df[0:2]
    通用函数 np.abs(df)
    布尔值过滤 df[df>0]

    ​ Series支持字典的特性

    详解 方法
    从字典创建Series Series(dic),
    in运算 ’a’ in sr
    键索引 sr['a'], sr[['a', 'b', 'd']]

    ​ Series缺失数据处理

    方法 详解
    dropna() 过滤掉值为NaN的行
    fillna() 填充缺失数据
    isnull() 返回布尔数组,缺失值对应为True
    notnull() 返回布尔数组,缺失值对应为False

    ​ DataFrame是一个表格型的数据结构,含有一组有序的列。

    ​ DataFrame可以被看做是由Series组成的字典,并且共用一个索引。

    属性 详解
    dtype 查看数据类型
    index 查看行序列或者索引
    columns 查看各列的标签
    values 查看数据框内的数据,也即不含表头索引的数据
    describe 查看数据每一列的极值,均值,中位数,只可用于数值型数据
    transpose 转置,也可用T来操作
    sort_index 排序,可按行或列index排序输出
    sort_values 按数据值来排序

    ​ 读取文件导入数据函数主要参数:

    参数 详解
    sep 指定分隔符,可用正则表达式如's+'
    header=None 指定文件无行名
    name 指定列名
    index_col 指定某列作为索引
    skip_row 指定跳过某些行
    na_values 指定某些字符串表示缺失值
    parse_dates 指定某些列是否被解析为日期,布尔值或列表

    ​ 写入文件函数的主要参数:

    参数 详解
    sep 分隔符
    na_rep 指定缺失值转换的字符串,默认为空字符串
    header=False 不保存列名
    index=False 不保存行索引
    cols 指定输出的列,传入列表

    三、matplotlib模块

    ​ matplotlib是一个绘图库,它可以创建常用的统计图,包括条形图、箱型图、折线图、散点图、饼图和直方图。

    一、条形图

    [0, 1, 2, 3]
    student_amounts = [66, 55, 45, 70]
    
    # 画布设置
    fig = plt.figure()
    # 1,1,1表示一张画布切割成1行1列共一张图的第1个;2,2,1表示一张画布切割成2行2列共4张图的第一个(左上角)
    ax1 = fig.add_subplot(1, 1, 1)
    ax1.bar(classes_index, student_amounts, align='center', color='darkblue')
    ax1.xaxis.set_ticks_position('bottom')
    ax1.yaxis.set_ticks_position('left')
    
    plt.xticks(classes_index,
               classes,
               rotation=0,
               fontsize=13,
               fontproperties=font)
    plt.xlabel('班级', fontproperties=font, fontsize=15)
    plt.ylabel('学生人数', fontproperties=font, fontsize=15)
    plt.title('班级-学生人数', fontproperties=font, fontsize=20)
    # 保存图片,bbox_inches='tight'去掉图形四周的空白
    # plt.savefig('classes_students.png?x-oss-process=style/watermark', dpi=400, bbox_inches='tight')
    plt.show()
    

    img

    二、直方图

    [59.00855949 43.16272141 48.77109774 ... 57.94645859 54.70312714
     58.94125528]
    # 构造均值为100的符合正态分布的数据
    x2 = mu2 + sigma * np.random.randn(10000)
    print(x2)
    [115.19915511  82.09208214 110.88092454 ...  95.0872103  104.21549068
     133.36025251]
    fig = plt.figure()
    ax1 = fig.add_subplot(121)
    # bins=50表示每个变量的值分成50份,即会有50根柱子
    ax1.hist(x1, bins=50, color='darkgreen')
    
    ax2 = fig.add_subplot(122)
    ax2.hist(x2, bins=50, color='orange')
    
    fig.suptitle('两个正态分布', fontproperties=font, fontweight='bold', fontsize=15)
    ax1.set_title('绿色的正态分布', fontproperties=font)
    ax2.set_title('橙色的正态分布', fontproperties=font)
    plt.show()
    

    img

    三、折线图

    [ 1.62434536  1.01258895  0.4844172  -0.58855142  0.2768562  -2.02468249
     -0.27987073 -1.04107763 -0.72203853 -0.97140891  0.49069903 -1.56944168
     -1.89185888 -2.27591324 -1.1421438  -2.24203506 -2.41446327 -3.29232169
     -3.25010794 -2.66729273 -3.76791191 -2.6231882  -1.72159748 -1.21910314
     -0.31824719 -1.00197505 -1.12486527 -2.06063471 -2.32852279 -1.79816732
     -2.48982807 -2.8865816  -3.5737543  -4.41895994 -5.09020607 -5.10287067
     -6.22018102 -5.98576532 -4.32596314 -3.58391898]
    plot_data2 = randn(40).cumsum()
    plot_data3 = randn(40).cumsum()
    plot_data4 = randn(40).cumsum()
    
    plt.plot(plot_data1, marker='o', color='red', linestyle='-', label='红实线')
    plt.plot(plot_data2, marker='x', color='orange', linestyle='--', label='橙虚线')
    plt.plot(plot_data3, marker='*', color='yellow', linestyle='-.', label='黄点线')
    plt.plot(plot_data4, marker='s', color='green', linestyle=':', label='绿点图')
    
    # loc='best'给label自动选择最好的位置
    plt.legend(loc='best', prop=font)
    plt.show()
    

    img

    四、散点图+直线图

    [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
    # 拟合一条水平散点线
    np.random.seed(1)
    y_linear = x + 10 * np.random.randn(19)
    print(y_linear)
    [ 17.24345364  -4.11756414  -2.28171752  -6.72968622  13.65407629
     -17.01538697  24.44811764   0.38793099  12.19039096   7.50629625
      25.62107937  -8.60140709   9.77582796  10.15945645  26.33769442
       5.00108733  15.27571792   9.22141582  19.42213747]
    # 拟合一条x²的散点线
    y_quad = x**2 + 10 * np.random.randn(19)
    print(y_quad)
    [  6.82815214  -7.00619177  20.4472371   25.01590721  30.02494339
      45.00855949  42.16272141  62.77109774  71.64230566  97.3211192
     126.30355467 137.08339248 165.03246473 189.128273   216.54794359
     249.28753869 288.87335401 312.82689651 363.34415698]
    # s是散点大小
    fig = plt.figure()
    ax1 = fig.add_subplot(121)
    plt.scatter(x, y_linear, s=30, color='r', label='蓝点')
    plt.scatter(x, y_quad, s=100, color='b', label='红点')
    
    ax2 = fig.add_subplot(122)
    plt.plot(x, y_linear, color='r')
    plt.plot(x, y_quad, color='b')
    
    # 限制x轴和y轴的范围取值
    plt.xlim(min(x) - 1, max(x) + 1)
    plt.ylim(min(y_quad) - 10, max(y_quad) + 10)
    fig.suptitle('散点图+直线图', fontproperties=font, fontsize=20)
    ax1.set_title('散点图', fontproperties=font)
    ax1.legend(prop=font)
    ax2.set_title('直线图', fontproperties=font)
    plt.show()
    

    [img]

  • 相关阅读:
    EF写in
    1707. [Usaco2007 Nov]tanning分配防晒霜
    BZOJ 1706. [usaco2007 Nov]relays 奶牛接力跑
    1705. [Usaco2007 Nov]Telephone Wire 架设电话线
    BZOJ1704. [Usaco2007 Mar]Face The Right Way 自动转身机
    Codeforces Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)
    BZOJ1702. [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列
    P2876 [USACO07JAN]解决问题Problem Solving
    BZOJ 1908. Pku2054 UVA1205 Color a Tree
    P4280 [AHOI2008]逆序对
  • 原文地址:https://www.cnblogs.com/tangceng/p/11379673.html
Copyright © 2011-2022 走看看