Линейная алгебра

Матричные вычисления, такие как умножение матриц, построение разложений матриц, вычисление определителя и др. являются важной частью любой библиотеки программ для численных расчетов. В отличие от некоторых языков программирования, таких как MATLAB, в NumPy операция * — это поэлементное умножение матриц, а не стандартное умножение матриц из линейной алгебры. В связи с этим в NumPy для умножения матриц реализована функция dot как в виде метода объекта типа ndarray, так и в виде функции из пространства имен numpy:

In [156]: x = np.array([[1., 2., 3.], [4., 5., 6.]])

In [157]: y = np.array([[6., 23.], [-1, 7], [8, 9]])

In [158]: x
Out[158]: 
array([[1., 2., 3.],
       [4., 5., 6.]])

In [159]: y
Out[159]: 
array([[ 6., 23.],
       [-1.,  7.],
       [ 8.,  9.]])

In [160]: x.dot(y)
Out[160]: 
array([[ 28.,  64.],
       [ 67., 181.]])

Выражение x.dot(y) эквивалентно np.dot(x, y):

In [161]: np.dot(x, y)
Out[161]: 
array([[ 28.,  64.],
       [ 67., 181.]])

Произведение матрицы на согласованный одномерный массив дает одномерный массив:

In [162]: np.dot(x, np.ones(3))
Out[162]: array([ 6., 15.])

Операция @ также выполняет умножение матриц:

In [163]: x @ np.ones(3)
Out[163]: array([ 6., 15.])

Модуль numpy.linalg стандартный набор функций для разложения матриц, а также вычисления определителя и обратной матрицы. Они реализуются с помощью тех же стандартных библиотек линейной алгебры, которые используются в других языках (например, MATLAB и R), таких как BLAS, LAPACK, или, возможно (в зависимости от вашей сборки NumPy), проприетарной Intel MKL (Math Kernel Library):

In [164]: from numpy.linalg import inv, qr

In [165]: X = np.random.randn(5, 5)

In [166]: mat = X.T.dot(X)

In [167]: inv(mat)
Out[167]: 
array([[  1.17126787,   0.63442101,  -0.43366495,   0.12451843,
         -0.43842659],
       [  0.63442101,  20.97155103,   4.85020898,   1.20337434,
        -25.85438743],
       [ -0.43366495,   4.85020898,   1.82425292,   0.15709542,
         -6.39429734],
       [  0.12451843,   1.20337434,   0.15709542,   0.33177322,
         -1.54477735],
       [ -0.43842659, -25.85438743,  -6.39429734,  -1.54477735,
         32.3946724 ]])

In [168]: mat.dot(inv(mat))
Out[168]: 
array([[ 1.00000000e+00,  4.44089210e-16,  0.00000000e+00,
        -1.38777878e-17, -4.44089210e-16],
       [ 0.00000000e+00,  1.00000000e+00,  7.10542736e-15,
         0.00000000e+00, -2.84217094e-14],
       [ 0.00000000e+00,  0.00000000e+00,  1.00000000e+00,
         8.88178420e-16, -1.42108547e-14],
       [-4.44089210e-16, -1.42108547e-14, -3.55271368e-15,
         1.00000000e+00,  1.42108547e-14],
       [ 0.00000000e+00, -1.42108547e-14, -3.55271368e-15,
         8.88178420e-16,  1.00000000e+00]])

In [169]: q, r = qr(mat)

In [170]: r
Out[170]: 
array([[-1.98177521, -1.01858515, -3.90022484, -1.74739689, -1.69358168],
       [ 0.        , -8.4068366 , -5.93064791, -5.55543324, -8.16388208],
       [ 0.        ,  0.        , -1.63499732, -2.80467309, -0.45129639],
       [ 0.        ,  0.        ,  0.        , -3.17546169, -0.14914608],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.02382757]])

В таблице представлены наиболее часто используемые функции линейной алгебры.

Таблица 6. Часто используемые функции модуля numpy.linalg

Функция Описание
diag Возвращает диагональные элементы квадратной матрицы в виде одномерного массива или преобразует одномерный массив в квадратную матрицу с нулями вне диагонали
dot Умножение матриц
trace След матрицы — сумма диагональных элементов
det Определитель матрицы
eig Вычисляет собственные значения и собственные векторы квадратной матрицы
inv Вычисляет обратную матрицу
pinv Вычисляет псевдообратную матрицу Мура—Пенроуза
qr Вычисляет \( QR \) разложение матрицы
svd Вычисляет сингулярное разложение матрицы (SVD)
solve Решает линейную систему \( A x = b \), где \( A \) — квадратная матрица
lstsq Находит решение линейной системы \( Ax = b \) методом наименьших квадратов