1、线性代数
线性代数(如矩阵乘法、矩阵分解、行列式以及其他方阵数学等)是任何数组库的重要组成部分。提供了一个用于矩阵乘法的dot函数(既是一个数组方法也是numpy命名空间中的一个函数):
x = np.array([[1,2,3],[4,5,6]])
y = np.array([[6.,23.],[-1,7],[8,9]])
x
Out[28]:
array([[1, 2, 3],
[4, 5, 6]])
y
Out[29]:
array([[ 6., 23.],
[-1., 7.],
[ 8., 9.]])
x.dot(y)
Out[30]:
array([[ 28., 64.],
[ 67., 181.]])
np.dot(x,y)
Out[31]:
array([[ 28., 64.],
[ 67., 181.]])
#一个二维数组跟一个大小合适的一维数组的矩阵点积运算之后将会得到一个一维数组:
np.dot(x,np.ones(3)) #np.ones(3)
Out[32]: array([ 6., 15.]) #Out[33]: array([1., 1., 1.])
np.dot(y,np.ones(2))
Out[37]: array([29., 6., 17.])
numpy.linalg中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的东西。它们跟MATLAB和R等语言所使用的是相同的行业标准级Fortran库,如BLAS、LAPACK、IntelMKL(可能有,取决于numpy版本)等:
from numpy.linalg import inv,qr
X = np.random.randn(5,5)
mat = X.T.dot(X) #X与X转置的乘积
inv(mat) #求逆
Out[41]:
array([[ 2.20368991, 0.96734814, 3.54606527, 1.38473068, -2.97351661],
[ 0.96734814, 1.02145768, 2.24307417, 0.8696279 , -1.76391267],
[ 3.54606527, 2.24307417, 7.02501391, 2.65095659, -5.74459431],
[ 1.38473068, 0.8696279 , 2.65095659, 1.24764755, -2.20325776],
[-2.97351661, -1.76391267, -5.74459431, -2.20325776, 5.01101457]])
mat.dot(inv(mat)) #mat与mat逆的矩阵乘积
Out[42]:
array([[ 1.00000000e+00, -5.71494158e-16, 6.21064872e-16,
-4.67468968e-17, -7.81130009e-17],
[-3.98883269e-16, 1.00000000e+00, -3.50915755e-18,
8.29266355e-16, -9.222693