数组操作
-
矩阵运算
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)
-
数组计算
数组的全通用函数 —是一种能够对数组中所有元素进行操作的函数–以整个数组为输出。
要求:运算的数组 —必须是同型
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) # 这两个数组不能相加
-
数组保存与读取
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) # 文本形式---以人可以识别的有序的序列内容进行保存
-
数组排序
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)
-
数组去重
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)
-
重复数组
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)
-
统计指标计算
主要有求和,均值,标准差,方差,最小值,最大值等。
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))