##矩阵基本运算 ###提取矩阵的行与列 考虑两个矩阵
M1=np.arange(24).reshape(4,6)
M2=np.arange(30,0,-1).reshape(6,5)
M1
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
M2
array([[30, 29, 28, 27, 26],
[25, 24, 23, 22, 21],
[20, 19, 18, 17, 16],
[15, 14, 13, 12, 11],
[10, 9, 8, 7, 6],
[ 5, 4, 3, 2, 1]])
for i in range(M1.shape[0]):
print('row', i, ':', M1[i])
for i in range(M1.shape[1]):
print('column', i, ':', M1[:,i])
###矩阵相乘 Matrix Multiplication 方法1
M1.dot(M2)
方法2:M1的每一列与M2的每一行相乘得出一个矩阵,再把这些矩阵相加
Mul1=np.zeros([M1.shape[0],M2.shape[1]])
for i in range(M1.shape[1]):
Mul1+=M1[:,i].reshape(M1.shape[0],1).dot(M2[i].reshape(1,-1))
ps:对于reshape的原因
M1[0,:]
Out:
array([0, 1, 2, 3, 4, 5])
M1[:,0].reshape(1,-1)
Out:
array([[ 0, 6, 12, 18]])
M1[:,0].reshape(4,1)
Out:
array([[ 0],
[ 6],
[12],
[18]])
方法3:M1的每一列与M2的每一行相乘得出一个数字,再合并为一个矩阵
Mul2=[M1[i].reshape(1,-1).dot(M2[:,j].reshape(M2.shape[0],1)).item() for i in range(M1.shape[0]) for j in range(M2.shape[1])]
###矩阵交换行与列 方法1
c=np.eye(3)
c
Out:
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
c[[0,2],:]=c[[2,0],:] #交换第一行与第三行,c[:,[1,2]]=c[:,[2,1]]则是交换第二列与第三列
c
Out:
array([[ 0., 0., 1.],
[ 0., 1., 0.],
[ 1., 0., 0.]])
方法2:交换行与列等同于左乘或右乘一个矩阵
d=np.array([1,2,1,3,8,1,0,4,1]).reshape(3,3)
e=c=np.array([0,1,0,1,0,0,0,0,1]).reshape(3,3)
d
Out:
array([[1, 2, 1],
[3, 8, 1],
[0, 4, 1]])
e
Out:
array([[0, 1, 0],
[1, 0, 0],
[0, 0, 1]])
d.dot(e)
Out:
array([[2, 1, 1],
[8, 3, 1],
[4, 0, 1]])
e.dot(d)
Out:
array([[3, 8, 1],
[1, 2, 1],
[0, 4, 1]])
###矩阵某一行(列)乘以一个数字后再加到另一行上:也能转化为左乘或者右乘一个矩阵
a=np.eye(3)
a[0,1]=-3
b=np.array([1,2,1,3,8,1,0,4,1]).reshape(3,3)
Mul_b_a=b.dot(a)
b1=b.copy()
b1[:,1]=b1[:,0]*(-3)+b1[:,1]
a
Out:
array([[ 1., -3., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
b
Out:
array([[1, 2, 1],
[3, 8, 1],
[0, 4, 1]])
Mul_b_a
Out:
array([[ 1., -1., 1.],
[ 3., -1., 1.],
[ 0., 4., 1.]])
b1
Out:
array([[ 1, -1, 1],
[ 3, -1, 1],
[ 0, 4, 1]])
#原矩阵b,如果a右乘b,非主对角元素a[i,j]=m,则影响b的列向量:b[:,j]=b[:,i]*m+b[:,j],对角元素则b[:i]=b[:i]*m
#原矩阵b,如果a左乘b,非主对角元素a[i,j]=m,则影响b的行向量:b[i]=b[j]*m+b[i],对角元素则b[i]=b[i]*m