Библиотека Numpy. Полезные инструменты

В статье рассмотрены некоторые полезные инструменты из библиотеки 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")

Numpy. Plot result

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. Работа с данными”.
Книга: Pandas. Работа с данными
Библиотека Numpy. Использование boolean массива для доступа к ndarray >>>

Добавить комментарий

Ваш адрес email не будет опубликован.