В статье рассмотрены некоторые полезные инструменты из библиотеки Numpy, которые довольно часто приходится использовать при решении задач в рамках машинного обучения и анализа данных.
Создание векторов и матриц
Вектора и матрицы – это основные объекты, которыми приходится оперировать в машинном обучении. Numpy предоставляет довольно много удобных функций, которые строят эти объекты.
Перед тем как их использовать не забудьте импортировать Numpy в проект.
>>>import numpy as np
np.arange()
Функция arange() аналогична по своему назначению функции range() из стандартной библиотеки Python. Ее основное отличие заключается в том, что arange() позволяет строить вектор с указанием шага в виде десятичной дроби.
Синтаксис использования функции следующий:
arange(stop)
arange(start, stop)
arange(start, stop, step)
В первом варианте будет создан вектор из целых чисел от 0 до stop.
>>> np.arange(10) array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Второй вариант позволяет задавать интервал, в этом случае вектор также будет содержать целые числа.
>>> np.arange(5, 12) array([ 5, 6, 7, 8, 9, 10, 11])
Третий вариант позволяет определить интервал чисел и шаг, который может быть десятичным числом
>>> np.arange(1, 5, 0.5) array([1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5])
np.matrix()
Matrix является удобным инструментом для задания матрицы. При этом можно использовать Matlab стиль, либо передать в качестве аргумента список Python (или массив Numpy).
Вариант со списком Python.
>>> a = [[1, 2], [3, 4]] >>> np.matrix(a) matrix([[1, 2], [3, 4]])
Вариант с массивом Numpy.
>>> b = np.array([[5, 6], [7, 8]]) >>> np.matrix(b) matrix([[5, 6], [7, 8]])
Вариант в Matlab стиле.
>>> np.matrix('[1, 2; 3, 4]') matrix([[1, 2], [3, 4]])
np.zeros(), np.eye()
В арсенале Numpy есть функции для создания специальных матриц: нулевых и единичных. Нулевой называется матрица, состоящая полностью из нулей. Для ее создания удобно использовать функцию zeros(), в качестве аргумента в нее передается кортеж из двух элементов, первый из них – это количество строк, второй – столбцов.
>>> np.zeros((3, 4)) array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]])
Функция eye() создает единичную матрицу – квадратную матрицу, у которой элементы главной диагонали равны единицы, все остальные – нулю.
>>> np.eye(3) array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])
Работа с матрицами и векторами
Вектора и матрицы, построенные с помощью Numpy можно складывать, вычитать, умножать, транспонировать и умножать на число. Перечисленные операции используются в большинстве задач, более специфические функции, в рамках данной статьи, рассматриваться не будут.
Создадим две матрицы.
>>> A = np.matrix('[1, 2; 3, 4]') >>> A matrix([[1, 2], [3, 4]]) >>> B = np.matrix('[5, 6; 7, 8]') >>> B matrix([[5, 6], [7, 8]])
Сложение матриц
>>> A + B matrix([[ 6, 8], [10, 12]])
Вычитание матриц
>>> A - B matrix([[-4, -4], [-4, -4]])
Умножение матрицы на число
>>> 3 * A matrix([[ 3, 6], [ 9, 12]])
Умножение матриц
>>> A.dot(B) matrix([[19, 22], [43, 50]])
Транспонирование матриц
>>> A.T matrix([[1, 3], [2, 4]]) >>> np.transpose(A) matrix([[1, 3], [2, 4]])
… И другие полезные функции
Далее будет представлен список функций, их описание и пример использования, которые могут быть полезны, если о них знать)
np.ravel()
Функция np.ravel() используется для того, чтобы преобразовать матрицу в одномерный вектор.
Создадим двумерную матрицу размера 3х3.
>>> A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) >>> A array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
Применим функцию ravel() к этой матрице.
>>> np.ravel(A) array([1, 2, 3, 4, 5, 6, 7, 8, 9])
У ravel() есть параметр order, который отвечает за порядок построения одномерного массива, по умолчанию он равен ‘C’, что означает – массив будет собираться из строк исходной матрицы.
>>> np.ravel(A, order='C') array([1, 2, 3, 4, 5, 6, 7, 8, 9])
Если указать order=‘F‘, то в качестве элементов для сборки будут выступать столбцы матрицы.
>>> np.ravel(A, order='F') array([1, 4, 7, 2, 5, 8, 3, 6, 9])
np.where()
Данная функция возвращает один из двух заданных элементов в зависимости от условия. Ее можно использовать для обработки численных данных.
>>> a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> np.where(a % 2 == 0, a * 10, a / 10) array([ 0. , 0.1, 20. , 0.3, 40. , 0.5, 60. , 0.7, 80. , 0.9])
В задачах машинного обучения эта функция хорошо подходит для реализации обработки данных с помощью пороговой функции.
>>> a = np.random.rand(10) >>> a array([0.99379074, 0.98387541, 0.2043767 , 0.11935986, 0.01063287, 0.11146634, 0.50504848, 0.96046102, 0.3645473 , 0.6843563 ]) >>> np.where(a > 0.5, True, False) array([ True, True, False, False, False, False, True, True, False, True]) >>> np.where(a > 0.5, 1, -1) array([ 1, 1, -1, -1, -1, -1, 1, 1, -1, 1])
np.meshgrid()
Функция meshgrid() позволят получить матрицу координат из координатных векторов. Если, например, у нас есть два одномерных вектора координат, то передав их в качестве аргументов в meshgrid() мы получим две матрицы, в которой элементы будут составлять пары, заполняя все пространство, определяемое этими векторами. Проще посмотреть это на примере.
Создадим два вектора
>>> x = np.linspace(0, 1, 5) >>> x array([0. , 0.25, 0.5 , 0.75, 1. ]) >>> y = np.linspace(0, 2, 5) >>> y array([0. , 0.5, 1. , 1.5, 2. ])
Построим матрицу координат с помощью meshgrid.
>>> xg, yg = np.meshgrid(x, y) >>> xg array([[0. , 0.25, 0.5 , 0.75, 1. ], [0. , 0.25, 0.5 , 0.75, 1. ], [0. , 0.25, 0.5 , 0.75, 1. ], [0. , 0.25, 0.5 , 0.75, 1. ], [0. , 0.25, 0.5 , 0.75, 1. ]]) >>> yg array([[0. , 0. , 0. , 0. , 0. ], [0.5, 0.5, 0.5, 0.5, 0.5], [1. , 1. , 1. , 1. , 1. ], [1.5, 1.5, 1.5, 1.5, 1.5], [2. , 2. , 2. , 2. , 2. ]])
Посмотрите внимательно на матрицы xg и yg. Каждому элементу xg[i,j] соответствует свой элемент yg[i,j]. Можно визуализировать эти данные.
Для начала импортируем matplotlib (он должен быть установлен).
import matplotlib.pyplot as plt %matplotlib inline
Последняя строка нужна, если вы работаете в Jupyter Notebook, чтобы графики рисовались “по месту”.
Теперь построим график
plt.plot(xg, yg, color="r", marker="*", linestyle="none")
np.random.permutation()
Функция permutation() либо генерирует список заданной длины из натуральных чисел от нуля до указанного числа, либо перемешивает переданный ей в качестве аргумента массив.
>>> np.random.permutation(7) array([6, 2, 5, 1, 0, 4, 3]) >>> a = ['a', 'b', 'c', 'd', 'e'] >>> np.random.permutation(a) array(['c', 'd', 'a', 'e', 'b'], dtype='<U1')
Основное практическое применение эта функция находит в задачах машинного обучения, где довольно часто требуется перемешать выборку данных перед тем, как передавать ее в алгоритм.
Например у нас есть вектор с данными
>>> arr = np.linspace(0, 10, 5) >>> arr array([ 0. , 2.5, 5. , 7.5, 10. ])
Перемешаем эту выборку
>>> arr_mix = np.random.permutation(arr) >>> arr_mix array([ 2.5, 0. , 5. , 10. , 7.5])
Построим массив индексов для вектора arr, в котором позиции находятся в случайном порядке
>>> index_mix = np.random.permutation(len(arr_mix)) >>> index_mix array([2, 4, 3, 1, 0]) >>> arr[index_mix] array([ 5. , 10. , 7.5, 2.5, 0. ])
P.S.
Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. На нашем сайте вы можете найти вводные уроки по этой теме. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.
Библиотека Numpy. Использование boolean массива для доступа к ndarray >>>