声明:本文环境为Windows10+jupyter notebook,请自行下载安装Anaconda
1、矩阵生成
【numpy矩阵库】
> Numpy中包含了一个矩阵库numpy.matlib,该模块中的函数返回的是一个矩阵,而不是一个mdarray对象。
> 一个m×n的矩阵是一个由m行(row)n列(column)元素排列成的矩阵阵列。
> 矩阵里的元素可以是数字、符号或数学式。
> Numpy和Maylib不一样,对于多维数组的运算,缺省情况下并不能使用矩阵运算,如果希望使用对数组进行矩阵运算的话,可以调用相应的函数。
# 常规方法生成
>> import numpy as np
>> x = np.matrix([[1,2,3],[4,5,6]])
>> y = np.matrix([1,2,3,4,5,6])
# x[0,0]返回行下标和列下标都为0的元素
# 注意,对于矩阵x来说,x[0,0]和x[0][0]的含义不一样
>> print(x,y,x[0,0],x[0][0],sep='\n\n')
运行结果:
[[1 2 3]
[4 5 6]]
[[1 2 3 4 5 6]]
1
[[1 2 3]]
》》matlib.empty()
numpy.matlib.empty(shape,dtype,order)
> shape:定义新矩阵形状的整数或整数元组
> Dtype:可选,数据类型
扫描二维码关注公众号,回复: 8872190 查看本文章![]()
> order:C(行序优先)或F(列序优先)
import numpy.matlib
import numpy as np
print(np.matlib.empty((2,2))) # 填充为随机数据
运行结果:
[[5.e-324 5.e-324]
[0.e+000 0.e+000]]
> numpy.matlib.zeros():创建一个以0填充的矩阵
> numpy.matlib.ones():创建一个以1填充的矩阵
import numpy.matlib
import numpy as np
print(np.matlib.zeros((2,2))) # 创建一个2行2列的全0矩阵
print(np.matlib.ones((2,2))) # 创建一个2行2列的全1矩阵
运行结果:
[[0. 0.]
[0. 0.]]
[[1. 1.]
[1. 1.]]
> numpy.matlib.eye():函数返回一个矩阵,对角线元素为1,其他位置为零。
numpy.matlib.eye(n,M,k,dtype)
# n:返回矩阵的行数
# M:返回矩阵的列数,默认为n
# k:对角线的索引
# dtype:数据类型
>> import numpy.matlib
>> import numpy as np
>> print(np.matlib.eye(n=3,M=4,k=0,dtype=int))
# 输出结果
[[1 0 0 0]
[0 1 0 0]
[0 0 1 0]]
numpy.matlib.identity():返回给定大小的单位矩阵
> 单位矩阵是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为1,除此以外全都为0.
>> import numpy.matlib
>> import numpy as np
# 大小为4,类型为整型
>> print(np.matlib.identity(4,dtype=int))
# 输出结果:
[[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[0 0 0 1]]
numpy.matlib.rand()函数:创建一个给定大小的矩阵,数据是随机填充的
>> import numpy.matlib
>> import numpy as np
>> print(np.matlib.rand(4,4)) # 创建一个4×4的随机矩阵,元素数值0~1
# 输出结果:
[[0.042389 0.89404592 0.55245114 0.6151029 ]
[0.83161717 0.88771178 0.91317702 0.23470988]
[0.75805183 0.1603858 0.50485415 0.39672934]
[0.76878398 0.22699211 0.25993602 0.3127131 ]]
2、常用矩阵操作
【矩阵与维数组相互转换】
> 矩阵总是二维的,而ndarray是一个n维数组。两个对象都是可互换的
>> import numpy.matlib
>> import numpy as np
>> i = np.matrix('1,2;3,4') # 创建一个二维矩阵i
>> print(i)
>> j = np.asarray(i) # 用i创建一个二维数组j
>> print(j)
>> k = np.asmatrix(j) # 用j创建一个二维矩阵k
>> print(k)
# 输出结果:
[[1 2]
[3 4]]
[[1 2]
[3 4]]
[[1 2]
[3 4]]
【查看矩阵特征】
# 查看矩阵特征
import numpy as np
x = np.matrix([[1,2,3],[4,5,6],[7,8,9]])
print(x,'\n')
print(x.mean(),end='\n===\n') # 所有元素的平均值
print(x.mean(axis=0),end='\n===\n') # 按列求平均值
print(x.mean(axis=0).shape,end='\n===\n') # 按列得出的平均值的组合的形状
print(x.mean(axis=1),end='\n===\n') # 横向平均值
print(x.sum(),end='\n===\n') # 所有元素之和
print(x.max(axis=1),end='\n===\n') # 按行求最大值
print(x.argmax(axis=0),end='\n===\n') # 横向最大值的下标
print(x.diagonal(),end='\n===\n') # 对角线元素
输出结果:
[[1 2 3]
[4 5 6]
[7 8 9]]
5.0
===
[[4. 5. 6.]]
===
(1, 3)
===
[[2.]
[5.]
[8.]]
===
45
===
[[3]
[6]
[9]]
===
[[2 2 2]]
===
[[1 5 9]]
===
【矩阵乘法】
,
,
,
即m行p列的矩阵与p行n列的矩阵相乘得到一个m行n列的矩阵,取前者行,后者列
# 矩阵乘法
import numpy as np
x = np.matrix([[1,2,3],[4,5,6]])
y = np.matrix([[1,2],[3,4],[5,6]])
print(x*y)
运算结果:
[[22 28]
[49 64]]
3、矩阵运算
> numpy.linalg中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的东西
> 他们跟MATLIB和R等语言所使用的的是相同的行业标准级Fortran库。
函数 | 说明 |
---|---|
diag | 以一维数组的形式返回方阵的对角线(或非对角线)元素,或将一维数组转换为方阵(非对角线元素为0) |
dot | 矩阵乘法 |
trace | 计算对角线元素的和 |
det | 计算矩阵行列式 |
eig | 计算方阵的特征值和特征向量 |
inv | 计算方阵的逆 |
svd | 计算奇异值分解(SVD) |
solve | 解线性方程组Ax=b,其中A为一个方阵 |
lstsq | 计算Ax=b的最小二乘解 |
numpy.dot():两个数组的点积,即元素对应相乘。
> 对于两个一维数组,计算的是这两个数组对应下标元素乘积和(数学上称为内积)。
> 对于二维数组,计算的是两个数组的矩阵乘积
> 对于多维数组,它的通用公式如下,即结果数组中的每个元素都是:数组a的最后以为上的所有元素与数组b的倒数第二位上的所有元素的和
dot(a,b)[i,j,k,m] = sum(a,[i,j,:]*b[k:,m])
numpy.dot(a,b,out=None)
# a:ndarray数组
# b:ndarray数组
# out:ndarray可选,用来保存dot()的计算结果
# numpy.dot()示例
import numpy.matlib
import numpy as np
a=np.array([[1,2],[3,4]])
b=np.array([[11,12],[13,14]])
print(np.dot(a,b))
输出结果:
[[37 40]
[85 92]]
numpy.vdot():返回两个向量的点积
> 如果第一个参数是复数,那么它的共轭复数会被用于计算,如果参数是多维数组,会被展开
import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[11,12],[13,14]])
print(a,'\n',b)
# vdot将数组展开计算内积,即对应位置元素相乘之和
print(np.vdot(a,b))
运行结果:
[[1 2]
[3 4]]
[[11 12]
[13 14]]
130
【numpy.linalg.inv():计算逆矩阵】
> 逆矩阵(inverse matrix):设A是数域上的一个n阶矩阵,若在相同数域上存在另一个n阶矩阵B,使得:AB=BA=E,则我们称B是A的逆矩阵,而A则被称为可逆矩阵。注:E为单位矩阵
import numpy as np
x = np.array([[1,2],[3,4]])
y = np.linalg.inv(x) # 计算x的逆矩阵
print(x)
print(y)
print(np.dot(x,y)) # 验证x与y的内积是否为1
输出结果:
[[1 2]
[3 4]]
[[-2. 1. ]
[ 1.5 -0.5]]
[[1.00000000e+00 1.11022302e-16]
[0.00000000e+00 1.00000000e+00]]
numpy.linalg.solve():求矩阵形式的线性方程的解
线性方程组:
...
可写作矩阵相乘的形式
其中,a为n×n的矩阵,x和b为m×1的矩阵
例如:下面这个线性方程组
x + y + z = 6
2y + 5z = -4
2x + 5y - z =27
# numpy.linalg.solve():求矩阵形式的线性方程的解
import numpy as np
a = np.array([[1,1,1],[0,2,5],[2,5,-1]]) # 系数矩阵
b = np.array([6,-4,27]) # 系数矩阵
x = np.linalg.solve(a,b) # 求解
print(x)
print(np.dot(a,x)) # 验证
输出结果:
[ 5. 3. -2.]
[ 6. -4. 27.]