numpy基础(part9)--矩阵

鄙人学习笔记,这个笔记以例子为主。
开发工具:Spyder



矩阵

矩阵是numpy.matrix类的对象,该类继承自numpy.ndarray,任何针对多维数组的操作,对矩阵同样有效,但作为子类矩阵又结合其自身的特点,做了必要的扩充,比如:乘法计算、求逆。

矩阵对象的创建

①创建方法1

  • 语法
# 如果copy的值为True(缺省),所得到的矩阵对象与参数中的源容器各自拥有独立的数据拷贝, 否则共享同一份数据。
numpy.matrix(
    ary,		# 任何可被解释为矩阵的二维容器
  	copy=True	# 是否复制数据(缺省值为True,即复制数据)
)

备注:默认选项(c),又称缺省值,是一种计算机术语,指在无决策者干预情况下,对于决策或应用软件、计算机程序的系统参数的自动选择。

  • 举个例子

代码1:

import numpy as np
ary = np.arange(1, 10).reshape(3, 3)
m = np.matrix(ary, copy=True)
print(m, type(m))
ary[0, 0] = 999
print(m, type(m))

结果1:

[[1 2 3]
 [4 5 6]
 [7 8 9]] <class 'numpy.matrixlib.defmatrix.matrix'>
[[1 2 3]
 [4 5 6]
 [7 8 9]] <class 'numpy.matrixlib.defmatrix.matrix'>

代码2:

import numpy as np
ary = np.arange(1, 10).reshape(3, 3)
m = np.matrix(ary, copy = False)
print(m, type(m))
ary[0, 0] = 999
print(m, type(m))

结果2:

[[1 2 3]
 [4 5 6]
 [7 8 9]] <class 'numpy.matrixlib.defmatrix.matrix'>
[[999   2   3]
 [  4   5   6]
 [  7   8   9]] <class 'numpy.matrixlib.defmatrix.matrix'>

②创建方法2

  • 语法
# 等价于:numpy.matrix(..., copy=False)
# 由该函数创建的矩阵对象与参数中的源容器一定共享数据,无法拥有独立的数据拷贝
numpy.mat(任何可被解释为矩阵的二维容器)

# 该函数可以接受字符串形式的矩阵描述:
# 数据项通过空格分隔,数据行通过分号分隔。
#例如:'1 2 3; 4 5 6'
numpy.mat(拼块规则)
  • 例子

代码:

import numpy as np
ary = np.arange(1, 10).reshape(3, 3)

ary02 = np.mat(ary)
print(ary02, type(ary02))
ary03 = np.mat('1 2 3;4 5 6')
print(ary03, type(ary03))

结果:

[[1 2 3]
 [4 5 6]
 [7 8 9]] <class 'numpy.matrixlib.defmatrix.matrix'>
[[1 2 3]
 [4 5 6]] <class 'numpy.matrixlib.defmatrix.matrix'>

矩阵的乘法运算

  • 语法
# 矩阵的乘法:乘积矩阵的第i行第j列的元素等于
# 被乘数矩阵的第i行与乘数矩阵的第j列的点积
e = np.mat('1 2 6; 3 5 7; 4 8 9')
print(e * e)
  • 例子

代码:

import numpy as np
ary = np.arange(1, 10).reshape(3, 3)

#数组相乘
print(ary*ary)
#矩阵相乘
print(np.mat(ary)*np.mat(ary))

结果:

[[ 1  4  9]
 [16 25 36]
 [49 64 81]]
[[ 30  36  42]
 [ 66  81  96]
 [102 126 150]]

矩阵的逆运算

若两个矩阵A、B满足:AB = BA = E (E为单位矩阵),则称B和A互为对方的逆矩阵。

  • 语法
e = np.mat('1 2 6; 3 5 7; 4 8 9')
print(e.I) #e的逆矩阵
  • 例子

代码:

import numpy as np

a = np.mat('2 0 0;0 3 0; 0 0 4')

#原矩阵
print(a)
#矩阵的逆
print(a.I)
#矩阵相乘
print(a*a.I)

结果:

[[2 0 0]
 [0 3 0]
 [0 0 4]]
[[ 0.5         0.         -0.        ]
 [ 0.          0.33333333 -0.        ]
 [ 0.          0.          0.25      ]]
[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]]

备注1:若矩阵A没有逆矩阵,则有些numpy版本会报错,有些则不会,需要注意。若A不为方阵,则会求出广义逆矩阵。
备注2:np.linalg.inv(A)也可以求逆矩阵,但A必须为方阵。若A不为方阵,则会报错。

多维数组的矩阵运算

ndarray提供了方法对多维数组进行矩阵运算。

  • 语法
a = np.array([
    [1, 2, 6],
    [3, 5, 7],
    [4, 8, 9]])
# 点乘法求ndarray的点乘结果,与矩阵的乘法运算结果相同
k = a.dot(a)
# linalg模块中的inv方法可以求取a的逆矩阵
l = np.linalg.inv(a)
  • 例子

代码:

import numpy as np

a = np.array([[2, 0, 1], 
              [0, 4, 0],
              [1, 0, 5]])

#原矩阵
print(a)
#矩阵相乘
print(a.dot(a))
#矩阵的逆
print(np.linalg.inv(a))

结果:

[[2 0 1]
 [0 4 0]
 [1 0 5]]
[[ 5  0  7]
 [ 0 16  0]
 [ 7  0 26]]
[[ 0.55555556  0.         -0.11111111]
 [ 0.          0.25        0.        ]
 [-0.11111111  0.          0.22222222]]

案例

求方程组:

中x, y ,z分别为多少?

计算方法1:

import numpy as np

a = np.array([[1, 3, 5], 
              [2, 1, 6],
              [1, 1, 2]])

b = np.array([[1], [2], [3]])

inv_a = np.linalg.inv(a)
print(inv_a.dot(b))

结果1:

[[ 4.71428571]
 [ 1.14285714]
 [-1.42857143]]

计算方法2:

import numpy as np

a = np.mat([[1, 3, 5], 
              [2, 1, 6],
              [1, 1, 2]])

b = np.mat([[1], [2], [3]])

#print(a, type(a))
#print(b, type(b))
print(a.I*b)

结果2:

[[ 4.71428571]
 [ 1.14285714]
 [-1.42857143]]

计算方法3(最小二乘法,求误差最小的一组):

import numpy as np

A = np.mat('1 3 5;2 1 6;1 1 2')
B = np.mat('1;2;3')
X = np.linalg.lstsq(A, B)

print(X)
print('---------------')
print(X[0])

结果3:

(matrix([[ 4.71428571],
        [ 1.14285714],
        [-1.42857143]]), matrix([], shape=(1, 0), dtype=float64), 3, array([ 8.88272389,  1.69756102,  0.46422282]))
---------------
[[ 4.71428571]
 [ 1.14285714]
 [-1.42857143]]

计算方法4(求唯一解):

import numpy as np

A = np.mat('1 3 5;2 1 6;1 1 2')
B = np.mat('1;2;3')
X = np.linalg.solve(A, B)

print(X)

结果4:

[[ 4.71428571]
 [ 1.14285714]
 [-1.42857143]]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章