数组操作

矩阵运算

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