矩阵点乘
在numpy中,*号用来对矩阵进行逐元素乘积。
我们熟悉的矩阵点乘,用dot函数。
举个栗子:
import numpy as np
x = np.array([[1, 2],
[2, 3]]) # 2*2矩阵
y = np.array([[4, 5],
[6, 7]]) # 2*2矩阵
print(x * y) # 逐元素相乘
# [[ 4 10]
# [12 21]]
print(x.dot(y)) # 点乘
# [[16 19]
# [26 31]]
注意:矩阵点乘时需要保证x的列数与y的行数相等。
另外,事情一旦牵扯到一维数组,就会变得比较奇怪。
按一贯的思维,一维数组应该是个行数为1,列数为元素个数的矩阵。
但在点乘计算时,却好像不是这样子的…`
import numpy as np
x = np.array([[1, 2, 3],
[4, 5, 6]]) # 2*3矩阵
y = np.array([1, 2, 3]) # 一维数组
y_1 = np.array([[1],
[2],
[3]]) # 3*1矩阵
print(np.dot(x, y))
# [14 32]
print(np.dot(x, y_1))
# [[14]
# [32]]
在这个栗子中,一维数组[1, 2, 3]是作为一个3*1的矩阵来操作的,而且dot函数返回了一个一维数组。
总结一下:
一个矩阵和一个长度合适的一维数组之间的矩阵乘积,结果是一个一维数组。
.
矩阵的转置、逆、行列式和特征值
numpy.linalg拥有一个矩阵分解的标准函数集。其中包含常见的求逆、行列式等操作。
- X.T:返回X的转置
- inv(X):返回X的逆矩阵
- det(X):返回X的行列式
- eig(X):返回X的特征值和特征向量
下面举个栗子:
import numpy as np
from numpy.linalg import inv,eig, det
x = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]) # 3阶方阵
trans = x.T
# [[1 4 7]
# [2 5 8]
# [3 6 9]]
inverse = inv(x)
# [[ 3.15251974e+15 -6.30503948e+15 3.15251974e+15]
# [-6.30503948e+15 1.26100790e+16 -6.30503948e+15]
# [ 3.15251974e+15 -6.30503948e+15 3.15251974e+15]]
determinant = det(x)
# -9.51619735392994e-16
eigen_value, eigen_vector = eig(x)
# [ 1.61168440e+01 -1.11684397e+00 -9.75918483e-16]
# [[-0.23197069 -0.78583024 0.40824829]
# [-0.52532209 -0.08675134 -0.81649658]
# [-0.8186735 0.61232756 0.40824829]]
参考资料
《利用python进行数据分析》