Библиотека Numpy помогает придерживаться двух принципов:
- Упрощение разработки и поддержки готового кода
- Оптимизация вычислений
Для этого разработчики библиотеки использовали следующие подходы и механизмы:
- Одинаковый интерфейс методов для выполнения операций над массивами разной размерности и типа
- Укладывание и векторизация для замены циклов
В этом уроке мы рассмотрим примеры векторизованных функций и методов — причем и встроенных в Numpy, и реализованных самостоятельно.
Арифметические операции
Начнем с самой простой арифметической операции — сложения:
import numpy as np
# Сумма элементов вектора
test_vector = np.array([1,5,9])
print(np.sum(test_vector))
# => 15
# Сумма элементов матрицы
test_matrix = np.array(
[
[2, 4, 6],
[1, 2, 8],
]
)
print(np.sum(test_matrix))
# => 23
Интерфейс функции np.sum()
позволяет применять ее к массивам разной размерности без изменения синтаксиса. Реализация без циклов делается в одну строчку кода как для векторов, так и для матриц.
В случае одномерной структуры (вектора) сложение элементов можно производить только по одному направлению. В случае матрицы все немного по-другому — их элементы можно складывать по двум осям:
- По строкам
- По столбцам
Для суммирования по каждой из осей достаточно параметризовать функцию np.sum()
таким образом:
# Сумма элементов матрицы по столбцам
print(np.sum(test_matrix, axis=0))
# => [ 3 6 14]
# Сумма элементов матрицы по строкам
print(np.sum(test_matrix, axis=1))
# => [12 11]
Интерфейс многих функций библиотеки Numpy сделан по аналогии с np.sum()
. Например, чтобы найти средние значения в матрице по строкам и столбцам, можно воспользоваться функцией np.mean()
с теми же параметрами:
# Среднее элементов матрицы по столбцам
print(np.mean(test_matrix, axis=0))
# => [1.5 3. 7. ]
# Среднее элементов матрицы по строкам
print(np.mean(test_matrix, axis=1))
# => [4. 3.67]