NumPy_矩阵的八种运算以及变换矩阵

概念

numpy下的linalg=linear+algebra
01.数学概念
  vector 向量  array:数组  matrix:矩阵 
  标量(数量) 物理定义:只有大小,没有方向的量
    n个有次序的数a_{1}, a_{2}, ····,a_{n}所组成的数组称为n维向量 --行向量和列向量
    数组,是有序的元素序列
    m×n 个数aij (i= 1,2,…,m;j= 1,2,…,n)排成的m 行n 列的数表
  标量(数量) 向量(矢量)矩阵 数组
02.计算机概念
 数组是编程语言中的概念,类似数学概念的集合,由元素组成。
   数组也被称为有序的元素序列,通过下标可访问相应的元素,其中的元素一般类型相同
  在numpy中
    vector 向量——一维数组
    matrix 矩阵——二维数组  2维数组中,axis=0指列方向,axis=1指行方向
    array  数组---n维数组  ndarray n维数组		

矩阵的计算

numpy下的linalg=linear+algebra
  np.linalg.inv():矩阵求逆
  np.linalg.det():矩阵求行列式(标量)
  np.linalg.eigh:计算矩阵特征向量
  
矩阵的加减法
矩阵的 数乘  乘法
矩阵的 转置   求逆矩阵 矩阵A的行列式|A|不等于0时才存在可逆矩阵
矩阵的 行列式
矩阵的特征值和特征向量
方阵的迹就是主对角元素之和	 

矩阵的乘法

矩阵乘法的 结合性:(AB)C = A(BC)
 np.dot(np.dot(A, B), C) == np.dot(A, np.dot(B, C))
 
阵加法的分配性:(A+B)C=AC+BC
  np.dot(A+B, C) == np.dot(A, C) + np.dot(B, C)
  
转置 np.dot(A, B).T == np.dot(B.T, A.T)   
  
数乘的结合律
 2*(np.dot(A, C)) ==np.dot(2*A, C)  ==   np.dot(A, 2*C) 
 
##一个是矩阵的转置操作(得到转置矩阵),一个是矩阵的逆操作(得到逆矩阵 

运算形式

矩阵的内积:两个矩阵A、B对应分量乘积之和,结果为一个标量,
        记作<A,B>(与向量的内积/点积/数量积的定义相似)。所以A、B的行数列数都应相同	 

分块矩阵的乘积

矩阵和向量的乘法---

 向量:数乘  点乘(内积)、叉乘(外积) 
 矩阵:数乘	 乘法        哈达玛积、 克罗内克积
    一个矩阵的数乘,其实就是矩阵的每一个元素乘以该数
 
 设A为m*s的矩阵,B为s*n的矩阵,那么称m*n的矩阵C为矩阵A与B的乘积,
  记作C=AB,称为A右乘B,也即为B左乘A

  线性代数中,矩阵的左乘和右乘可以简记为:“左乘行变换,右乘列变换”。
  
  转换坐标系--世界到局部
    A*B的结果可以理解为B矩阵经过A的转换,转到了和A同级别的坐标系下
	 点的左乘
  
  局部坐标系旋转平移
  
  转换矩阵的变换

正交矩阵

 一个矩阵与它的转置矩阵相乘的结果是一个单位矩阵,则该矩阵被称为一个正交矩阵
 正交矩阵的转置矩阵与逆矩阵相等 

  旋转矩阵是正交矩阵 3*3	
  坐标变换矩阵是正交矩阵
     不是所有的4*4矩阵都是变换矩阵--变换矩阵对数据的位置是有要求的

齐次坐标 --	 

示例代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-#

import numpy as np

if __name__ == '__main__':

    m_points_ones=np.array([
	        [5,6,7,1],
           [2,3,4,1]])
    transrora_m_v=np.array([
            [5,2,3,6],
            [6,3,2,5],
            [8,9,1,2],
            [0,0,0,1]])
    transrora_v_s=np.array([
            [2,2,3,4],
            [6,3,4,5],
            [7,8,9,6],
            [0,0,0,1]])
    ##变换方式 01 
    v_points = np.dot(transrora_m_v,m_points_ones.T).T
    s_points = np.dot(transrora_v_s,v_points.T).T
    print("result  s_points",s_points)
    ##变换方式 02 
    transrora_m_s = np.dot(transrora_v_s,transrora_m_v)
    s_2_points = np.dot(transrora_m_s,m_points_ones.T).T
    print(transrora_m_s)
    print("result  s_2_points" ,s_2_points)
    ###变换方式 03
    s_3_points = np.dot(m_points_ones,np.dot(transrora_m_v.T, transrora_v_s.T )  ) 
    print(np.linalg.inv(transrora_m_v),transrora_m_v,transrora_m_v.T )
    print("result  s_3_points",s_3_points)
    ### E_array 是单位矩阵,transrora_m_v才可能是正交矩阵--不是所有的矩阵都是变换矩阵--变换矩阵是正交矩阵,
    # 手动给变换矩阵的时候,注意判断是都为正交矩阵
    E_array = np.dot(transrora_m_v,transrora_m_v.T)
    print(E_array)
    # data_hom = np.hstack( [m_points_ones[:,:3], np.ones(m_points_ones.shape[0]).reshape(-1,1) ] ) 	
    # data_hom = np.vstack( [m_points_ones[:,:3].T, np.ones(m_points_ones.shape[0]) ] ).T 	
    # print(data_hom)

参考

 《Numpy 数据处理详情>-python机器学习和数据科学中的高性能计算方法》
posted @ 2023-05-25 20:19  辰令  阅读(211)  评论(0编辑  收藏  举报