线性代数,比如矩阵乘法、分解、行列式等方阵数学,是所有数组类库的重要组成部分。和Matlab等其他语言相比,Numpy的线性代数中有所不同的是*是矩阵的逐元素乘积,而不是矩阵的点乘积。因此NumPy的数组方法和numpy命名空间中都有一个函数dot,用于矩阵的操作:
>> > x = np.array( [ [ 1.,2.,3.] ,[ 4.,5.,6.] ] )
>> > y = np.array( [ [ 6.,23.] ,[ -1,7] ,[ 8,9] ] )
>> > x
array( [ [ 1., 2., 3.] ,
[ 4., 5., 6.] ] )
>> > y
array( [ [ 6., 23.] ,
[ -1., 7.] ,
[ 8., 9.] ] )
>> > x.dot( y)
array( [ [ 28., 64.] ,
[ 67., 181.] ] )
>> > np.dot( x,y)
array( [ [ 28., 64.] ,
[ 67., 181.] ] )
一个二维数组和一个长度合适的一维数组之间的矩阵乘积,其结果是一个一维数组:
>> > np.dot( x,np.ones( 3))
array( [ 6., 15.] )
>> > x @ np.ones( 3)
array( [ 6., 15.] )
numpy.linalg拥有一个矩阵分解的标准函数集,以及其他常用函数,例如求逆和行列式求解。这些函数都是通过在MATLAB和R等其他语言使用的相同的行业标准线性代数库来实现的,例如BLAS、LAPACK或英特尔专有的MKL(数学核心库)(是否使用MKL取决于使用NumPy的版本):
>> > from numpy.linalg import inv,qr
>> > X = np.random.randn( 5,5)
>> > mat = X.T.dot( X)
>> > inv( mat)
array( [ [ 0.18949471, -0.23045707, -0.10194047, 0.24860639, -0.07878032] ,
[ -0.23045707, 0.57360482, 0.08499988, -0.39548269, 0.04012748] ,
[ -0.10194047, 0.08499988, 0.82805002, -0.23124339, 0.15493678] ,
[ 0.24860639, -0.39548269, -0.23124339, 0.72541432, -0.09648418] ,
[ -0.07878032, 0.04012748, 0.15493678, -0.09648418, 0.14085473] ] )
>> > mat.dot( inv( mat))
array( [ [ 1.00000000e+00, -1.07871053e-16, -1.09219802e-16,
3.95670878e-16, 1.57486508e-16] ,
[ -9.52439100e-17, 1.00000000e+00, 7.45253384e-17,
1.10968802e-16, 9.93202436e-18] ,
[ 9.44428246e-19, -2.05395912e-17, 1.00000000e+00,
2.87152531e-17, -2.51201472e-17] ,
[ 2.46662044e-17, -1.44893157e-16, -1.46467367e-16,
1.00000000e+00, -6.61372669e-17] ,
[ -3.72426218e-17, -3.45464245e-17, 2.42343156e-16,
2.46040385e-16, 1.00000000e+00] ] )
>> > q,r = qr( mat)
>> > r
array( [ [ -18.72327702, -5.72138902, 0.99839179, 2.34455365,
-10.89317503] ,
[ 0. , -3.19464238, -0.39202645, -2.63291228,
-0.3624643 ] ,
[ 0. , 0. , -2.11533827, 0.17322111,
6.81924047] ,
[ 0. , 0. , 0. , -1.55441663,
-3.94815465] ,
[ 0. , 0. , 0. , 0. ,
4.04983738] ] )
表达式X.T.dot(X)计算的是X和它的转置矩阵X.T的点乘积。 下表示最常用的线性代数函数列表。