numpy模块
计算速度快,提供了数组操作、数组运算、以及统计分布和简单的数学模型,用来存储和处理大型矩阵。
创建矩阵(掌握)
矩阵即numpy的ndarray对象,创建矩阵就是把一个列表传入np.arrray()方法。
#创建一维的ndarray对象import numpy as nplis = [1,2,3]np.array(lis)print(arr,type(arr))[1 2 3]
#创建二维的ndarray对象print(np.array([[1,2,3],[4,5,6]]))[[1 2 3] [4 5 6]]
#创建三维的ndarrayprint(np.array([[[2.10025514, 0.12015895, 0.61720311], [ 0.30017032, -0.35224985, -1.1425182 ], [-0.34934272, -0.20889423, 0.58662319]], [[ 0.83898341, 0.93110208, 0.28558733], [ 0.88514116, -0.75439794, 1.25286816], [ 0.51292982, -0.29809284, 0.48851815]], [[-0.07557171, 1.13162939, 1.51981682], [ 2.18557541, -1.39649634, -1.44411381], [-0.50446586, 0.16003707, 0.87616892]]]))[[[ 2.10025514, 0.12015895, 0.61720311], [ 0.30017032, -0.35224985, -1.1425182 ], [-0.34934272, -0.20889423, 0.58662319]], [[ 0.83898341, 0.93110208, 0.28558733], [ 0.88514116, -0.75439794, 1.25286816], [ 0.51292982, -0.29809284, 0.48851815]], [[-0.07557171, 1.13162939, 1.51981682], [ 2.18557541, -1.39649634, -1.44411381], [-0.50446586, 0.16003707, 0.87616892]]]
获取矩阵的行列数
arr = np.array([[1,2,3],[4,5,6]])print(arr)[[1,2,3] [4,5,6]]
#获取矩阵的行和列构成的数组print(arr.shape)(2,3)
#获取矩阵的行print(arr.shape[0])2
#获取矩阵的列print(arr.shape[1])3
切割矩阵
切分矩阵类似于列表的切割,但是与列表不切割不同的是,矩阵的切割涉及到行和列的切割,但是两者的切割的方式都是从索引0开始,并且取头不取尾。
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]]
#取出第二行,第三列的元素,默认第一行参数为0print(arr[1,2]) 7
#取第一行矩阵的元素print(arr[0,[0,1,2,3]]) [1 2 3 4]
#取出第一行矩阵的元素print(arr[0,:])[1 2 3 4]
#取出第一列矩阵的元素print(arr[:,0]) [1 5 9]
#矩阵按运算符取元素的原理,即通过arr > 5生成一个布尔矩阵print(arr > 5)[[False False False False] [False True True True] [ True True True True]]
#取大于5的元素,返回一个数组print(arr[arr > 5])[ 6 7 8 9 10 11 12]
矩阵元素替换
矩阵元素的替换,类似于列表元素的替换,并且矩阵也是一个可变类型的数据,即如果对矩阵进行替换操作,会修改原矩阵的元素,所以下面我们用.copy()方法举例矩阵元素的替换。
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]]
#替换6为0arr[1,1] = 0print(arr)[[ 1 2 3 4] [ 5 0 7 8] [ 9 10 11 12]]
#取第一行的所有元素,并且让第一行的元素都为1arr[0,:] = 1print(arr)[[ 1 1 1 1] [ 5 6 7 8] [ 9 10 11 12]]
# 取出大于5的元素,并且让大于5的元素都为2arr[arr>5] = 2print(arr)[[1 2 3 4] [5 2 2 2] [2 2 2 2]]
矩阵的合并
arr1 = np.array([[1,2],[3,4],[5,6]])print(arr1)[[1 2] [3 4] [5 6]]
arr2 = np.array([[7,8],[9,10],[11,12]])print(arr2)[[ 7 8] [ 9 10] [11 12]]
- vstack和hstack只能放一个参数,这个参数必须得是容器
#合并两个矩阵的列,注意使用vatack()方法合并矩阵,矩阵应该有相同的列,其中vstack的v表示vertical垂直的print(np.vstack((arr1,arr2))) [[ 1 2] [ 3 4] [ 5 6] [ 7 8] [ 9 10] [11 12]]
#合并两个矩阵的行,注意使用hstack()方法合并矩阵,矩阵应该有相同的行,其中hastack的h表示horizontal水平的print(np.hstack((arr1,arr2)))[[ 1 2 7 8] [ 3 4 9 10] [ 5 6 11 12]]
#合并两个矩阵的列 默认垂直print(np.concatenate((arr1,arr2)))[[ 1 2] [ 3 4] [ 5 6] [ 7 8] [ 9 10] [11 12]]
在numpy中,为了统一做处理,只要有axis参数的,axis=0就是列,axis=1就是行
#合并两个矩阵,其中axis=0表示合并两个矩阵的列print(np.concatenate((arr1,arr2),axis=0)) [[ 1 2] [ 3 4] [ 5 6] [ 7 8] [ 9 10] [11 12]]
#合并两个矩阵,其中axis=0表示合并两个矩阵的行print(np.concatenate((arr1,arr2),axis=1)) [[ 1 2 7 8] [ 3 4 9 10] [ 5 6 11 12]]
通过函数创建多维数组
方法 | 详解 |
---|---|
array() | 将列表转换为数组,可选择显式指定dtype |
arange() | range的numpy版,支持浮点数 |
linspace() | 类似arange(),第三个参数为数组长度 |
zeros() | 根据指定形状和dtype创建全0数组 |
ones() | 根据指定形状和dtype创建全1数组 |
eye() | 创建单位矩阵 |
empty() | 创建一个元素全随机的数组 |
reshape() | 重塑形状 |
#创建一维数组print(np.arange(10))[0 1 2 3 4 5 6 7 8 9]
#取出1到10的数组,步长为2print(np.arange(1,10,2))[1 3 5 7 9]
#创建一个3*4值为1的矩阵print(np.ones((3,4)))[[1. 1. 1. 1.] [1. 1. 1. 1.] [1. 1. 1. 1.]]
#创建一个3*4*5 高为3,行为4,列为5的全0矩阵print(np.zeros((3,4,5)))[[[0. 0. 0. 0. 0.] [0. 0. 0. 0. 0.] [0. 0. 0. 0. 0.] [0. 0. 0. 0. 0.]] [[0. 0. 0. 0. 0.] [0. 0. 0. 0. 0.] [0. 0. 0. 0. 0.] [0. 0. 0. 0. 0.]] [[0. 0. 0. 0. 0.] [0. 0. 0. 0. 0.] [0. 0. 0. 0. 0.] [0. 0. 0. 0. 0.]]]
#创建一个5*5的单位矩阵print(np.eye(5))[[1. 0. 0. 0. 0.] [0. 1. 0. 0. 0.] [0. 0. 1. 0. 0.] [0. 0. 0. 1. 0.] [0. 0. 0. 0. 1.]]
矩阵的运算
+ 两个矩阵对应元素相加- 两个矩阵对应元素相减* 两个矩阵对应元素相乘/ 两个矩阵对应的元素相除,如果都是整数则取商% 两个矩阵对应元素相除后取余数**n 单个矩阵每个元素都取n次方,如**2:每个元素都取平方
print(arr1+arr2)[[ 8 10] [12 14] [16 18]]
#点乘和转置print(np.dot(arr1,arr2.T))[[ 23 29 35] [ 53 67 81] [ 83 105 127]]
#求逆矩阵print(np.linalg.inv(np.dot(arr1,arr2.T)))[[-3.51843721e+13 7.03687442e+13 -3.51843721e+13] [ 7.03687442e+13 -1.40737488e+14 7.03687442e+13] [-3.51843721e+13 7.03687442e+13 -3.51843721e+13]]
#最大值print(arr1.max())6
#最小值print(arr1.min())1
arr1.argmax(axis=1) # 获取矩阵最大元素的索引位置arr1.mean() # 获取矩阵所有元素的平均值arr1.mean(axis=0) # 获取矩阵每一列的平均值arr1.mean(axis=1) # 获取矩阵每一行的平均值arr1.var() # 获取矩阵所有元素的方差arr1.var(axis=0) # 获取矩阵每一列的元素的方差arr1.var(axis=1) # 获取矩阵每一行的元素的方差arr1.std() # 获取矩阵所有元素的标准差arr1.std(axis=0) # 获取矩阵每一列的元素的标准差arr1.std(axis=1) # 获取矩阵每一行的元素的标准差np.median(arr1) # 获取矩阵所有元素的中位数np.median(arr1,axis=0) # 获取矩阵每一列的元素的中位数np.median(arr1,axis=1) # 获取矩阵每一行的元素的中位数arr1.sum() # 对矩阵的每一个元素求和arr1.sum(axis=0) # 对矩阵的每一列求和arr1.sum(axis=1) # 对矩阵的每一行求和arr1.cumsum() # 累加和,如arr1=[1,2,3],arr1.cumsum=[1,3,6],第n个元素为前n-1个元素累加
numpy生成随机数
函数名称 | 函数功能 | 参数说明 |
---|---|---|
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)内产生随机数 | size为随机数的shape,可以为元祖或者列表 |
choice(a[, size]) | 从arr中随机选择指定数据 | arr为1维数组;size为数组形状 |
uniform(low,high [,size]) | 给定形状产生随机数组 | low为最小值;high为最大值,size为数组形状 |
shuffle(a) | 与random.shuffle相同 | a为指定数组 |
np.random.seed(1) #固定随机数,永不随机,固定print(np.random.rand(3,4)) #生成3*4的矩阵
#RandomState()方法会让数据值随机一次,之后都是相同的数据rs = np.random.RandomState(1)print(rs.rand(3,4))[[4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-01] [1.46755891e-01 9.23385948e-02 1.86260211e-01 3.45560727e-01] [3.96767474e-01 5.38816734e-01 4.19194514e-01 6.85219500e-01]]