矩阵相关计算-基础
#
import numpy as np #引入numpy库
import numpy.linalg as lg ##导入numpy.linalg 求矩阵的逆
##创建矩阵
#创建一维narray对象
narray_1d = np.array([1,2,3,4,5])
#创建二维narray对象
narray_2d = np.array([[1,2,3,4,5],[6,7,8,9,10]])
#创建三维方阵
narray_3d = np.array([[1,2,3],[4,5,6],[7,8,9]])
##通过arange() 函数创建矩阵
b1 = np.arange(10) #默认从0开始到10(不包括10),默认步长1 [0 1 2 3 4 5 6 7 8 9]
b2 = np.arange(5,10) #从5开始到10 ,默认步长1 [5 6 7 8 9]
b3 = np.arange(5,20,2) #从5到20,步长2 [ 5 7 9 11 13 15 17 19]
print(b1)
print(b2)
print(b3)
##linspace()创建等差数列(线性等分向量)
c = np.linspace(0,10,5)#生成首位是0,末位是10,含5个数的等差数列[ 0. 2.5 5. 7.5 10. ]
print(c)
##logspace()创建等比数列 以10为底,(起始次方,终止次方,创建个数)
d = np.logspace(0,2,5) #[ 1. 3.16227766 10. 31.6227766 100. ]
print(d)
##ones创建全是1的矩阵
e1 = np.ones((3,4))
print(e1)
'''
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
'''
##zeros创建全是0的矩阵
e2 = np.zeros((3,4))
print(e2)
'''
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
'''
##eye创建单位矩阵
e3 = np.eye(3)
print(e3)
'''
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
'''
##empty创建空矩阵(实际有值)
e_empty = np.empty((3,4))
print(e_empty)
'''
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
'''
##fromstring()方法可以将字符串转化成ndarray对象,获得字符串的ASCII序列
# str = 'abdcf'
# str_array = np.fromstring(str,dtype=np.int8) #因为一个字符8位,所以指定dtype=np.int8
# print(str_array) #[ 97 98 100 99 102]
##fromfunctin()根据矩阵的行号列号生成矩阵元素
def func(i,j):
return i+j
fr_func_array = np.fromfunction(func,(5,6))
print(fr_func_array)
'''
[[0. 1. 2. 3. 4. 5.]
[1. 2. 3. 4. 5. 6.]
[2. 3. 4. 5. 6. 7.]
[3. 4. 5. 6. 7. 8.]
[4. 5. 6. 7. 8. 9.]]
'''
##获取矩阵的行数列数
print(narray_3d.shape) #结果返回一个tuple (3, 3)
##获取行数
print(narray_3d.shape[0]) #返回行数 3
print(narray_3d.shape[1]) #返回列数 3
##矩阵截取
#截取第一行
print(narray_3d[0:1]) #[[1 2 3]]
#截取第二行,第二,三列
print(narray_3d[1,1:3])
#截取第二行
print(narray_3d[1,:])
#按条件截取
#截取矩阵中大于2的元素,返回一维数组
print(narray_3d[narray_3d>2]) #[3 4 5 6 7 8 9]
#布尔语句首先生成布尔矩阵,将布尔矩阵传入[]实现截取
print(narray_3d>3)
'''
[[False False False]
[ True True True]
[ True True True]]'''
#满足条件就替换
narray_3d[narray_3d>3] = 10
print(narray_3d)
'''
[[ 1 2 3]
[10 10 10]
[10 10 10]]'''
#矩阵的合并,以列表或元祖形式传入
a1 = np.array([[1,2],[3,4]])
a2 = np.array([[5,6],[7,8]])
#横向合并
print(np.hstack([a1,a2]))
'''
[[1 2 5 6]
[3 4 7 8]]
'''
#纵向合并
print(np.vstack([a1,a2]))
'''
[[1 2]
[3 4]
[5 6]
[7 8]]
'''
##矩阵的运算
#对应元素操作 相加+ 相减- 相乘* 相除/ 相除取余% 每个元素次方**
##常见矩阵函数
#对每个元素操作 三角函数:
#np.sin(a) np.cos(a) np.tan(a) np.arcsin(a) np.arccos(a) np.arctan(a)
##每个元素取指数函数 np.exp(a)
##每个元素开根号 np.sqrt(a)
##当矩阵元素不在定义与范围时:RuntimeWarning 结果为nan(not a number)
##矩阵运算
#1.矩阵乘法(点乘)
g1 = np.array([[1,2,3],[4,5,6]])
g2 = np.array([[1,2],[3,4],[5,6]])
print(g1.shape[1]==g2.shape[0]) ##True,满足矩阵乘法条件
#矩阵点乘np.dot()
print(g1.dot(g2))
'''
True
[[22 28]
[49 64]]
'''
#矩阵转置np.transpose()
print(g1.transpose())
'''
[[1 4]
[2 5]
[3 6]]
'''
#简单方法
print(g1.T)
'''
[[1 4]
[2 5]
[3 6]]
'''
#矩阵的逆 需先导入numpy.linalg 用linalg的inv函数来求逆
求逆条件,行数=列数
mitr1 = np.array([[0,1,1],[1,1,1],[1,1,0]])
#求逆
print(lg.inv(mitr1))
'''
[[-1. 1. 0.]
[ 1. -1. 1.]
[-0. 1. -1.]]
'''
#奇异矩阵无法求逆
mitr2 = np.array([[0,1,1],[1,1,1],[1,0,0]]) #奇异矩阵:Singular matrix
print(lg.inv(mitr2))
##初等行变换不能将矩阵化成单位矩阵
'''
[[1. 0. 0. 0. 0. 1.]
[0. 1. 1. 0. 1. -1.]
[0. 0. 0. 1. -1. 1.]]
'''
##求解矩阵Ax=b
A = np.mat('1 1 ;0 1') #生成一个矩阵A
b = np.array([2,1])
x = np.linalg.solve(A,b)
print(A)
print(b)
print(x)
##求矩阵的特征值特征向量eig
eigvalue,eigvector=np.linalg.eig(A)
print('特征值:',eigvalue,'特征向量 :',eigvector)
##矩阵信息获取
##最大最小值.max() .min()
B = np.random.random((5,4))
print(B)
print('B数组最大元素:',B.max())
print('B数组最小元素:',B.min())
print('B数组每列最大元素:',B.max(axis=0))
print('B数组每行最小元素:',B.min(axis=1))
print('B数组最大元素所在位置(按行遍历):',B.argmax(axis=1))
##矩阵中元素的平均值mean(),也可获得行列的平均值
print(B.mean())
print(B.mean(axis=0)) #按列取平均值
print(B.mean(axis=1)) #按行取平均值
##矩阵元素的方差函数var(),相当于mean(abs(x-x.mean()**2))
print(B.var()) #所有元素的方差
print(B.var(axis=0)) #每列元素的方差
print(B.var(axis=1)) #每行元素的方差
##标准差std() 相当于 sqrt(mean(abs(x-x.mean()**2))) 或 sqrt(B.var())
print(B.std()) #所有元素的标准差
print(B.std(axis=0)) #每列元素的标准差
print(B.std(axis=1)) #每行元素的标准差
##中值median():将序列排序,奇数个取中间值,偶数个取中间两值的均值
print(np.median(B)) #取所有值中值
print(np.median(B,axis=0)) #沿列方向取中值
print(np.median(B,axis=1)) #沿行方向取中值
##求和sum() :对行,列,或整个矩阵求和
print(B.sum()) #对整矩阵求和
print(B.sum(axis=0)) #对列求和
print(B.sum(axis=1)) #对行求和
##累计和sumsum():当前位置之前的所有元素之和。如:[1,2,3,4,5],其累计和为[1,3,6,10,15]
##同理可对行列 整个矩阵累积和
print(B.cumsum()) #对整个矩阵累积和
print(B.cumsum(axis=0)) #列累积和
print(B.cumsum(axis=1)) #行累积和
参考:https://www.cnblogs.com/smallpi/p/4550361.html

浙公网安备 33010602011771号