Python与线性代数——Numpy中的matrix()和array()的区别
Posted ratels
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python与线性代数——Numpy中的matrix()和array()的区别相关的知识,希望对你有一定的参考价值。
Numpy中matrix必须是2维的,但是 numpy中array可以是多维的(1D,2D,3D····ND)。matrix是array的一个小的分支,包含于array。所以matrix 拥有array的所有特性。
matrix() 和 array() 的区别,主要从以下方面说起:
矩阵生成方式不同
import numpy as np a1 = np.array([[1, 2], [3, 4]]) b1 = np.mat([[1, 2], [3, 4]]) a2 = np.array(([1, 2], [3, 4])) b2 = np.mat(([1, 2], [3, 4])) a3 = np.array(((1,2), (3,4))) b3 = np.mat(((1,2), (3,4))) b4 = np.mat(‘1 2; 3 4‘) print(" ",a1," ",b1," ",a2," ",b2," ",a3," ",b3," ",b4)
结果均为:
[[1 2] [3 4]]
上述变化就是将 “[]” 换成“()”。不同之处在于 b4 内用引号、空格和分号来产生矩阵,这个方法只可以在 matrix() 函数中使用,即b4 = np.mat(‘1 2; 3 4‘)。不可以写成的 a4 = np.array(‘1 2; 3 4‘) 。
矩阵性质不同
matrix()和 array ()后面加上 .T 得到转置。但是matrix()还可以在后面加 .H 得到共轭矩阵, 加 .I 得到逆矩阵, array()就不可以。
import numpy as np a1 = np.array([[1, 2], [3, 4]]) b1 = np.mat([[1, 2], [3, 4]]) print(a1.T) print(b1.T)
[[1 3] [2 4]] [[1 3] [2 4]]
import numpy as np a1 = np.array([[1, 2], [3, 4]]) print(a1.H)
AttributeError: ‘numpy.ndarray‘ object has no attribute ‘H‘
print(a1.I)
AttributeError: ‘numpy.ndarray‘ object has no attribute ‘I‘
import numpy as np b1 = np.mat([[1, 2], [3, 4]]) print(b1.H) print(b1.I)
[[1 3]
[2 4]]
[[-2. 1. ]
[ 1.5 -0.5]]
在矩阵乘法中的不同
array()的乘法是矩阵中对应位置的两个数相乘
mat()的乘法是矩阵乘法
import numpy as np a1 = np.array([[1, 2], [3, 4]]) c1 = np.array([[5,6],[7,8]]) b1 = np.mat([[1, 2], [3, 4]]) d1 = np.mat([[5,6],[7,8]]) print("a1乘c1的结果:",a1*c1) print("b1乘d1的结果:",b1*d1)
a1乘c1的结果: [[ 5 12]
[21 32]]
b1乘d1的结果: [[19 22]
[43 50]]
array()和mat(),若让他们都遵循矩阵乘法,可以用dot()函数
print(np.dot(a1,c1)) print(np.dot(b1,d1))
[[19 22]
[43 50]]
[[19 22]
[43 50]]
矩阵平方:array()的平方是矩阵对应位置数的平方。mat()的平方是矩阵乘积
print("a1的平方",a1**2) print("b1的平方",b1**2)
a1的平方 [[ 1 4] [ 9 16]] b1的平方 [[ 7 10] [15 22]]
总结
array()乘法:*代表点乘(对应元素相乘),dot()代表矩阵乘。
mat()乘法:*代表矩阵乘,multiply()代表点乘。
array()和mat()之间的转换
array()——>mat():np.asmatrix()
a1 = np.array([[1,2], [3,4]])
a1
array([[1, 2], [3, 4]])
a2 = np.asmatrix(a1)
a2
matrix([[1, 2], [3, 4]])
mat()——>array():np.asarray()
b1 = np.mat([[1,2], [3,4]])
b1
matrix([[1, 2], [3, 4]])
b2 = np.asarray(b1)
b2
array([[1, 2], [3, 4]])
np.multiply
对 array 和 matrix 对象的操作相同
(1) a 和 b 维度相同
都是每行对应元素相乘(即对应内积的第一步,不求和)
>>> a = np.array([[1,2],[1,2]]) >>> a*a >>> array([[1, 4], [1, 4]])
(2)对于两个矩阵元素 a 和 b 维度不一的情况(array 和 matrix 对象都适用),则需将相应的行和列进行扩充,需要扩充的行或列的维度必须为 1。
对列扩充则补 1, 对行扩充则将第一行复制到每一行。比如,a:3 * 1, b: 1 * 2,则 a 扩充为 3 * 2,b 扩充为 3 * 2。
如下所示:
>>> a = np.array([[1],[1],[1]]) >>> b = np.array([1,2]) >>> np.multiply(a, b) >>> array([[1, 2], [1, 2], [1, 2]])
(3)a 和 b为标量:则标量直接相乘
*
(1)对于 matrix 对象,代表矩阵乘法(维度必须满足相应规则);
(2)对于array对象,则是每行对应元素相乘。当 array 对象的 shape 不同时(matrix 对象不行) ,其规则和 np.multiply 一样;
np.matmul
该函数对 array 和 matrix 对象的操作是不一样的。
(1)对于 matrix 对象,对应矩阵乘法,对象维度必须满足矩阵乘法规则。
(2)对于 array 对象,对应内积,但对象维度必须相同,不支持维度扩展。
(3)不支持标量运算。
在array 中,与 multiply 一样,每行对应元素相乘
np.dot
对于matrix 对象,对应矩阵乘法。
对于两个 array 类型的元素:a,b,有如下可能:
(1)a 和 b 都是一维 array,那么 dot 就是它们的内积(点乘);
(2)a 和 b 都是二维 array,那么 dot 就是它们的矩阵乘积(即按矩阵乘法规则来计算),也可以用 matmul 或 a @ b;
(3)如果a 和 b 都是标量(scalar),那么 dot 就是两个数的乘积,也可以用 multiply 或 a * b;
(4)若 a:N * D,b:1 * D,那么 dot 为 a 的每一行和 b (只有一行)的 内积;
>>>a = a = np.array([[1,2], [3, 4]]) >>>b = np.array([1, 2]) >>>np.dot(a, b) >>>array([ 5, 11])
5)a:N * D,b:M * D (N >= M)a 的所有行和 b 的所有行的内积,共要计算 N * M 次,结果的 shape 为:N * M。
>>>a = a =np.array([[1, 2], [2, 3], [3, 4]]) >>>b = b =np.array([[1, 2], [2, 3]]) >>>np.dot(a, b) >>>array([[ 5, 8], [ 8, 13], [11, 18]])
参考:
https://www.cnblogs.com/keye/p/11195428.html
https://blog.csdn.net/qq_42522262/article/details/86777426
以上是关于Python与线性代数——Numpy中的matrix()和array()的区别的主要内容,如果未能解决你的问题,请参考以下文章