矩阵相关计算-基础

#
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

原文地址:https://www.cnblogs.com/liuhuacai/p/10950302.html