数据分析系列2—numpy进阶

数组操作

  1. 矩阵运算

    import numpy as np
    
    # 创建矩阵进行运算
    m1 = np.mat('1 2;3 4')  # ---(2,2)
    m2 = np.asmatrix([[2, 1], [1, 2]])  # ----(2,2)
    print('m1:\n', m1)
    print('m2:\n', m2)
    print('*' * 100)
    
    # 矩阵相加 ---同型矩阵 ---对应位置相加
    print('m1 + m2 :\n', m1 + m2)
    
    # 矩阵相减---矩阵加上后面的矩阵的负矩阵 ---对应位置相减
    print('m1 - m2 :\n', m1 - m2)
    
    
    # 矩阵与 数的相乘 ----每一个元素都与数进行相乘
    # 3 和 m1 进行相乘
    print('3 * m1 :\n', 3 * m1)
    
    # # 矩阵 与矩阵 相乘
    # # 规则:如果两个矩阵进行相乘,左矩阵的列 必须等于右矩阵的行,才能相乘
    # # 生成一个左矩阵行、右矩阵列的矩阵
    print('m1 * m2:\n', m1 * m2)
    # np.matmul
    print('m1 * m2 :\n', np.matmul(m1, m2))
    # np.dot
    print('m1 * m2 :\n', np.dot(m1, m2))
    
    # 矩阵对应位置元素相乘 ---同型矩阵
    print('m1、m2对应位置元素相乘:\n', np.multiply(m1, m2))
    
    # 矩阵性质
    # 矩阵转置
    print('m1 的转置:\n',m1.T)
    # 矩阵的逆
    print('m1 的逆矩阵:\n', m1.I)
    # 逆矩阵性质---A*A的逆 = E   ----> |A| = 0 --->直接报错,或者出现inf
    print('m1 * m1 的逆矩阵:\n', m1 * m1.I)
    
    # 矩阵的视图
    # 可以通过np.mat np.asmatrix将ndarray转化为矩阵
    # 可以通过矩阵.A 来获取 ndarray
    print('m1 的视图:\n', m1.A)
    print('m1 视图的类型:\n', type(m1.A))  # <class 'numpy.ndarray'>
    
    # 索引---对于ndarray,使用下标会降低维度
    # 对于矩阵 --使用下标 不降低维度
    print('获取m1的/元素', m1[0, :])
    
    # 矩阵的共轭转置
    # 先共轭,再转置  ---复数
    print('m1的共轭转置:\n',m1.H)
    
  2. 数组计算

    数组的全通用函数 —是一种能够对数组中所有元素进行操作的函数–以整个数组为输出。

    要求:运算的数组 —必须是同型

    import numpy as np
    
    # 创建两个数组
    # arr1 = np.array([[1, 2], [2, 1]])  # (2,2)
    # arr2 = np.arange(1, 5).reshape((2, 2))  # (2,2)
    # print('arr1:\n', arr1)
    # print('arr2:\n', arr2)
    # print('*' * 100)
    # (1) 四则运算 --- + - * / ** ---->对应位置运算进行对应的四则元素--以整个数组为一个运算单位
    # print('arr1 + arr2:\n', arr1 + arr2)  # 对应位置元素相加
    # print('arr1 - arr2 :\n', arr1 - arr2)  # 对应位置元素相减
    # print('arr1 * arr2 :\n', arr1 * arr2)  # 对应位置元素相乘
    # print('arr1 / arr2 :\n', arr1 / arr2)  # 对应位置元素相除---注意:除数不能为0
    # print('arr1 ** arr2:\n', arr1 ** arr2)  # 对应位置元素求幂
    
    # (2) 比较运算 --- > < >= <= == !=  ---->返回bool数组
    # 对应位置元素进行比较,如果满足比较的条件,返回True 否则为False --->返回bool数组
    # print('arr1 == arr2 :\n', arr1 == arr2)
    # print('arr1 <= arr2:\n', arr1 <= arr2)
    # print('arr1 > arr2 :\n', arr1 > arr2)
    # print('*' * 100)
    
    # (3) 逻辑运算 ---返回bool值
    # np.all  相当于and --只有都满足的条件的时候,才返回True,只要有一个不满足,结果即为False
    # np.any  相当于or --只要有一个满足条件,就返回True,全部都不满足条件,则结果为False
    # print('all:\n', np.all(arr1 == arr2))
    # print('all:\n', np.all(arr1 <= arr2))
    # print('any:\n', np.any(arr1 == arr2))
    # print('any:\n', np.any(arr1 > arr2))
    
    # 先比较---然后利用比较运算返回的bool数组进行索引操作
    # 创建一个数组---身高的数组
    height = np.array([170, 175, 178, 180, 172])
    # 找到偶数的身高 ---bool数组
    bool_mask = height % 2 == 0
    print(bool_mask)
    
    # 筛选出具体的偶数的身高
    new_height = height[bool_mask]
    print(new_height)
    
    # 创建两个数组
    arr1 = np.arange(6).reshape((2, 3))  # (2,3)-->shape的长度为2
    arr2 = np.array([2, 1, 3])  # (3,) --->shape的长度为1 ---> arr2向arr1看齐 --->(1,3)
    arr3 = np.array([[1, 2], [2, 1]])  # (2,2)
    print('arr1:\n', arr1)
    print('arr2:\n', arr2)
    print('arr3:\n', arr3)
    
    # 数组的广播机制 --- 不同型的数组的算术运算规则
    # print('arr1 + arr2 :\n', arr1 + arr2)
    # print('arr1 + arr3 :\n', arr1 + arr3)  # 不能运算
    
    # arr1
    #  [[0 1 2]
    #  [3 4 5]]
    
    # arr2
    #  [2 1 3] --->(1,3)  --->[[2 1 3]] -->行维度为1 ---沿着行维度的计算,---都使用第0行数据
    
    # (4) ---两个数组进行运算--如果有维度为1,沿着此轴上的运算都用第一组值
    
    # 根据(4) --->arr2
    # [[2 1 3]
    # [2 1 3]]
    
    #  [[0 1 2]  +  [[2 1 3]
    #  [3 4 5]]     [2 1 3]]
    
    # --->[[2 2 5]
    #      5 5 8 ]]
    #      ---->输出(2,3)
    # 输入(2,3)  (3,)-->(1,3) --->可以运算
    
    # arr1  arr3 为什么不能运算?
    # arr1 (2,3)  arr3(2,2)
    # (2)规则---> 输出(2,3) --->(3)规则
    # ---输出数组形状的列维度 与 arr3输入数组形状在列维度不相等且并没有一个为1的,所以不能运算
    
    # 假设存在arr1 shape为(1,2,3,4,4,5,6)数组
    # 存在arr2 shape为(1,2,4,4,1,1)数组--->(1,1,2,4,4,1,1)
    # 这两个数组不能相加
    
    
  3. 数组保存与读取

    import numpy as np
    
    # 数组可以以二进制形式、文本形式进行保存
    
    # 二进制形式---以0101的这种进行保存
    # 创建一个数组进行保存
    arr = np.arange(16).reshape((4, 4))
    print(arr)
    # 将单个数组以二进制形式进行保存
    # 参数1 路径+ 名称,此时,文件后缀名可以省略,默认保存成以.npy为结尾二进制文件
    # 参数2 需要保存的数组
    np.save('./arr',arr)
    print('保存成功')
    
    # 加载.npy文件
    # 参数 文件路径+名称,此时后缀名不能省略
    data = np.load('./arr.npy')
    print('加载的数据为:\n',data)
    
    # 文本形式---以人可以识别的有序的序列内容进行保存
    
    
  4. 数组排序

    import numpy as np
    
    # 创建一个一维的数组
    arr = np.array([5, 4, 6, 8, 1, 2, 9])
    print('arr:\n', arr)
    
    # 对数组进行排序 ---快排--对列的方向的进行排序--对原数组直接产生影响
    arr.sort()
    # 升序排序
    print('排序之后的数组:\n', arr)
    
    # 创建二维的数组
    # arr = np.array([[7, 5, 8], [9, 6, 4], [3, 4, 9]])
    # print(arr)
    
    # 对二维数组进行排序
    # 列的方向进行升序排序
    # 如:此时排序,各行之间毫无关系,只是在各行内部,对不同的列进行升序排序
    # arr.sort()
    # 行的方向上升序排序
    # 如:此时排序,各列之间毫无关系,只是在各列内部,对不同的行进行升序排序
    # arr.sort(axis=0)
    # print('排序之后的数组:\n', arr)
    
    # 间接排序
    # 不对数组排序,只是返回数组排序之后的下标
    arr = np.array([5, 4, 6, 8, 1, 2, 9])
    print('arr:\n', arr)
    # 使用np.argsort进行排序
    res = np.argsort(arr)
    print('排序之后的结果:\n',res)
    
    # 二维数组
    # arr = np.array([[7, 5, 8], [9, 6, 4], [3, 4, 9]])
    # print(arr)
    #
    # # 列的方向 ---返回的是对应的下标
    res = np.argsort(arr, axis=-1)
    print(res)
    
    
  5. 数组去重

    import numpy as np
    
    # 数组去重功能
    # 创建数组
    arr = np.array([2, 2, 2, 2, 1, 1, 1, 5, 5, 5, 4, 4, 4, 6, 6, 6])
    print(arr)
    
    arr = np.array(['zs', 'ls', 'ww', 'zl', 'kk', 'zz', 'zs', 'ls', 'ww', 'zl', 'kk'])
    print(arr)
    arr = np.array(['小明','小名','小名','小名','小花','小华','小花'])
    print(arr)
    print('*' * 100)
    
    # 查看该数组中具有哪些数据
    # 可以使用unique进行去重,---兼并排序
    # 英文数组 也适用
    # 中文数组 也适用  ---- 中文数组排序 ----编码---unicode---之后在进行ansii排序
    res = np.unique(arr)
    print(res)
    
  6. 重复数组

    import numpy as np
    
    # 创建一个二维数组
    arr = np.arange(9).reshape((3, 3))
    print('arr:\n', arr)
    print('*' * 100)
    
    # 重复 -# np.tile --以数组的整体为单位进行重复
    # 参数1 需要重复的数组
    # 参数2 重复次数 ---可以指定按照对应的维度重复的次数
    res = np.tile(arr, 2)
    print(res)
    # 现在列的方向重复2次之后,以整体再在行的方向重复2次,再在以整体在块的方向重复2次
    res = np.tile(arr, [2, 2, 2])
    print(res)
    
    # np.repeat
    # 重复
    # 参数1 需要重复的数组
    # 参数2 重复的次数
    # axis 指定重复方向、轴
    # 若指定轴,沿着轴的方向以整行、整列为一个重复单位来重复指定的次数
    res = np.repeat(arr, 2, axis=1)
    # 如果不指定轴,默认会将数组展开,然后按照列的方向 以每一个元素为一个重复单位来重复指定次数
    # res = np.repeat(arr, 2)
    # # 不能省略重复次数
    print(res)
    
  7. 统计指标计算

    主要有求和,均值,标准差,方差,最小值,最大值等。

    import numpy as np
    
    # 创建一个二维数组
    arr = np.arange(1, 17).reshape((4, 4))
    print('arr:\n', arr)
    print('*' * 100)
    
    # np.统计指标  --numpy里面的方法
    # arr.统计指标 --ndarray里面的方法
    
    # 沿着行的方向 ---向下统计的
    # sum(和)  -----相加
    print('对arr 进行求和:', np.sum(arr, axis=0))
    
    # mean(均值) -----和/个数
    print('对arr 进行求均值:', np.mean(arr, axis=0))
    
    # std(标准差) ---反应的数据的离散程度
    print('对arr 进行求标准差:', np.std(arr, axis=0))
    
    # var(方差) ---标准差的平方---反应的数据的离散程度
    print('对arr 进行求方差:', np.var(arr, axis=0))
    
    # min(最小值)
    print('对arr 进行求最小值:', np.min(arr, axis=0))
    # max(最大值)
    print('对arr 进行求最大值:', np.max(arr, axis=0))
    
    # argmin(最小值的下标)
    print('对arr 进行求最小值下标:', np.argmin(arr, axis=0))
    
    # argmax(最大值的下标)
    print('对arr 进行求最大值下标:', np.argmax(arr, axis=0))
    
    # cumsum(累计和)
    print('对arr 进行求累计和:\n', np.cumsum(arr, axis=0))
    # cumprod(累计积)
    print('对arr 进行求取累计积:\n', np.cumprod(arr, axis=0))
    
    # 如果不指定轴 ---展开进行成一维进行统计指标
    print('对arr 进行求取累计和:\n',np.cumsum(arr))
    
    
    # ndarray里面的方法
    print('对arr 进行求取累计和:\n',arr.cumsum(axis=0))
    
    

猜你喜欢

转载自blog.csdn.net/qq_42486675/article/details/106724652