🔮矩阵的转置✨
前言
在很多时候我们拿到的数据本身可能并不会把点的坐标按列的方向排列起来,对于我们人类来说,更方便的方式依然是把这个点的坐标按行的方向排列,我们比较熟悉把矩阵看作为一个数据,在这里,P矩阵其实我们就把它看作是一个数据矩阵。
T = ( 1.5 0 0 2 ) T=\begin{pmatrix} 1.5 &0 \\ 0&2\end{pmatrix} T=(1.5002)
P = ( 0 0 4 0 5 3 ) P=\begin{pmatrix} 0 &0 \\ 4 &0 \\ 5 &3\end{pmatrix} P= 045003
在这种情况下,我们依然习惯于把每一行在数据科学中叫做样本。换句话说, 每一行是一个点,而每一列在数据科学中管它叫做特征或者属性,那么对于点坐标的数据来说,每一列就代表某一个维度的值,这个第一列就是x轴或者叫x方向上的值,而第二个维度是y轴或者y方向的值,但是大家一定要知道这个矩阵T是无法和这个矩阵P相乘的,因为一个2x2的矩阵是无法和一个3×2的矩阵相乘的,但是我们拿到的数据如果是这样的一个矩阵怎么办?答案非常简单,我们需要对矩阵P进行转置操作, 所谓的转置就是让行成为列, 让列成为行
P T = ( 0 4 5 0 0 3 ) P^T=\begin{pmatrix} 0 & 4&5 \\ 0& 0&3\end{pmatrix} PT=(004053)
在这里 P T P^T PT就称为 P的转置矩阵
如果从矩阵中的元素角度来看的话, 那么
A
=
(
a
i
j
)
A=(a_{ij})
A=(aij) 、
A
T
=
(
a
j
i
)
A^T=(a_{ji})
AT=(aji)
我们说起一个。向量如果不进行特殊声明的话,都是指一个列向量
🧩矩阵转置的性质💫
- ( A T ) T = A (A^T)^T=A (AT)T=A
- ( A + B ) T = A T + B T (A+B)^T=A^T+B^T (A+B)T=AT+BT
- ( k ⋅ A ) T = k ⋅ A T (k·A)^T=k·A^T (k⋅A)T=k⋅AT
- 接下来要注意矩阵乘法的转置就有些不同了
(
A
B
)
T
=
B
T
⋅
A
T
(AB)^T=B^T·A^T
(AB)T=BT⋅AT, 我们可以这样去看待和理解
在上篇文章中我们已经给出了线性代数中向量和矩阵的项目结构和程序代码, 在这里我们紧接着上篇文章中的项目代码在Matrix类中添加矩阵的转置方法。项目代码在这篇文章末尾➡️14-矩阵相乘及其运算法则
🎯实战1–矩阵类的转置方法及其Numpy中的矩阵对象🙌
├───Linear_Algebra
│ │ main_matrix.py
| | main_numpy_Matrix.py
│ │
│ │
│ ├───playLA
│ │ │ Matrix.py
│ │ │ Vector.py
│ │ │ _globals.py
│ │ │ __init__.py
| | |
接下来我们往Matrix.py
程序中的Matrix类中添加转置方法
def T(self):
"""返回矩阵的转置矩阵"""
return Matrix([[e for e in self.col_vector(i)] for i in range(self.col_num())])
紧接着我们在main_matrix.py
中进行测试
# coding:utf-8
from playLA.Matrix import Matrix
from playLA.Vector import Vector
if __name__ == '__main__':
matrix = Matrix([[1, 2], [3, 4]])
print(matrix)
print('matrix.shape=', matrix.shape())
print("matrix.size=", matrix.size())
print("len(matrix)=", len(matrix))
print("matrix[0][0]=", matrix[0, 0])
matrix2 = Matrix([[5, 6], [7, 8]])
print(matrix + matrix2)
print(matrix - matrix2)
print(matrix * 2)
print(2 * matrix)
print(Matrix.zero(2, 3))
T = Matrix([[1.5, 0], [0, 2]])
p = Vector([5, 3])
print(T.dot(p))
P = Matrix([[0, 4, 5], [0, 0, 3]])
print(T.dot(P))
print(matrix.dot(matrix2), matrix2.dot(matrix)) # 验证矩阵相乘是否遵循交换律
print(P.T()) # 测试程序转置功能是否实现
然后我们再来看一下Numpy中的矩阵对象及其相关的运算
main_numpy_Matrix.py
# coding:utf-8
import numpy as np
if __name__ == '__main__':
"""Numpy中的矩阵和向量是封装在一个类中"""
# 矩阵的创建
A = np.array([[1, 2], [3, 4]])
print(A)
# 矩阵的属性
print(A.shape)
print(A.T) # 矩阵的转置
# 获取矩阵的元素
print(A[1, 1])
print(A[0]) # 在计算机中矩阵默认是采用行的形式来存储的
print(A[:,0]) # 获取矩阵A第一列的向量
print(A[1, :]) # 获取矩阵第二行元素
# 矩阵的基本运算
B = np.array([[5, 6, ], [7, 8, ]])
print(A + B)
print(A - B)
print(A * 10)
print(10 * A)
print(A * B) # 注意它不是矩阵相乘, 它是矩阵的对应元素相乘
print(A.dot(B)) # 矩阵相乘
# 矩阵和向量的运算
p = np.array([10, 100])
print(A + p) # 矩阵和向量相加其实是矩阵的每一行都分别去和向量进行相加
print(A + 1) # 这其实是高维数组的一种广播机制
print(A.dot(p))