Списки - встроенный тип Python, могут содержать любые элементы: целые, дробные числа, строки, объекты. Это великая сила Python, но в то же время и слабость — в отношении скорости работы.

В стандартные дистрибутивы Python входит модуль array, реализующий аналог массивов C/C++, он может пригодиться для простейших расчётов с многомерными массивами, матрицами.

NumPy — мощнейшая библиотека для научных вычислений. Написать здесь операции с матрицами так же просто, как и с обычными числами.

Матрица в NumPy — это объект numpy.array, массив чисел одного типа, какой угодно размерности: 0 (одно число, скаляр), 1 (вектор), 2 (матрица), 3 (тензор третьего ранга)...

Матрицы во многом похожи на списки и массивы модуля array: поддерживают индексацию с таким же синтаксисом и легко преобразуются в них.

Перейдём к делу. Например, нужно посчитать произведение и сумму матриц, скаляров и векторов. Мы бы на бумаге записали так:

ABC*D + E, где B,C — матрицы 2x2, D,E — вектор-столбцы, A — скаляр (число).

import numpy as np

A = 1.5 # обычное число
A = np.array([1.5]) # а можно и так

B = np.diag((1.32, 0.78)) # треугольная, матрица, делаем диагональную матрицу
B[0, 1] = 3.12 # потом дописываем элемент B_12 (обозначение, как мы привыкли в институтах)

C = np.zeros((1, 2)) # сначала делаем вектор-строку и заполняем нулями,
C = np.concatenate((C, [­[3, 2.]])) # добавляем внизу вектор-строку (3, 2)
C[0][0] = 0.97 # и для интереса сделаем элемент (1,1) ненулевым
C = C.T # а теперь транспонируем, тоже для интереса

D = np.array([10, 12], dtype=float) # просто делаем вектор-столбец с дробными числами,
# а точки писать лень (но и без dtype вычисления будут дробные, так как дробные числа уже есть)

E = np.ones((2, 1), dtype=float) # вектор-столбец из единиц
E *= 2.3 # домножим для интереса

M = A * B * C * D + E # проще пареной репы!!!

print B
print C
print D
print E
print M

Результат:

[­[ 1.32 3.12]
[ 0. 0.78]]

[­[ 0.97 3. ]
[ 0. 2. ]]

[ 10. 12.]

[­[ 2.3]
[ 2.3]]

[­[ 21.506 170.78 ]
[ 2.3 30.38 ]]

Мораль:

производить действия с матрицами в NumPy так же просто, как и при рисовании их символов в тетради на парах линейной алгебры. Пусть этот пример выглядит наивным, но он показывает, что есть множество инструментов для конструирования матриц, не говоря уже о банальной инициализации известными элементами.

А если речь идёт о матрицах 10x10? Трёхмерных, четырёхмерных? С комплексными числами? И даже с произвольными объектами вместо чисел (если определить арифметические действия над ними)?

NumPy Вам в помощь.



Комментарии