Матричные вычисления, такие как умножение матриц, построение
разложений матриц, вычисление определителя и др. являются важной
частью любой библиотеки программ для численных расчетов. В отличие от
некоторых языков программирования, таких как 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 \) методом наименьших квадратов |