Python и DataScience: изучаем возможности универсальной библиотеки Numpy

в 8:58, , рубрики: data science, numpy, python, Блог компании Skillbox, вычисления, математика, Учебный процесс в IT

Python и DataScience: изучаем возможности универсальной библиотеки Numpy - 1

От переводчика: это перевод материала Ракшита Васудева, давно и плотно изучающего DataScience и применение в ней языка Python. Автор рассказывает о мощной библиотеке Numpy, который позволяет реализовать многие возможности машинного обучения и работы с большими данными.

Numpy — математическая библиотека для Python. Она позволяет выполнять разного рода вычисления эффективно и быстро. Она значительно расширяет функциональность Python благодаря специальным решениям, которые в ней применяются. В этой статье рассказывается о базовых возможностях Numpy, и это только первая часть; чуть позже будут опубликованы и другие. Статья для тех, кто только начинает изучать Numpy, вступая в дивный мир математики в Python.

Skillbox рекомендует: Практический курс «Python-разработчик с нуля».
Напоминаем: для всех читателей «Хабра» — скидка 10 000 рублей при записи на любой курс Skillbox по промокоду «Хабр».

Импорт библиотеки

import numpy as np

В этом месте мы говорим Python, что np — это референс для Numpy, который и будет использоваться впредь.

Теперь создадим массив python и массив np.

# python array
a = [1,2,3,4,5,6,7,8,9]
 
# numpy array
A = np.array([1,2,3,4,5,6,7,8,9])

Большой разницы при выводе нет.

print(a)
print(A)
====================================================================
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1 2 3 4 5 6 7 8 9]

Хорошо, почему в таком случае лучше использовать массив numpy вместо обычного? Ответ — потому что np позволит нам быстрее производить вычисления и модифицировать общую архитектуру приложения.

np.arange()

np.arange(0,10,2)
====================================================================
array([0, 2, 4, 6, 8])

([start],stop,[step]) упорядочивает цифры. Вот что это означает для машины.

Формируем np-список, начиная с 0 до 10, но не включаем 10, плюс увеличиваем цифры на 2 каждый раз.

Таким образом, у нас получается вот что:
array([0, 2, 4, 6, 8])

Важно помнить, что последняя цифра не включается в список.

Другой пример:

np.arange(2,29,5)
====================================================================
array([2, 7, 12, 17, 22, 27])

Этот массив можно также назвать матрицей или вектором. Поэтому не переживайте, когда я говорю, например: «Форма матрицы — 2*3». Все это означает, что наш массив в итоге будет выглядеть примерно так:

array([2, 7, 12],
      [17, 22, 27])

Теперь давайте поговорим о таком параметре, как shape для массива np по умолчанию. Shape здесь — атрибут. Пример его использования — ниже.

A = [1, 2, 3, 4, 5, 6, 7, 8, 9]
A.shape
====================================================================
(9,)

Это матрица из чисел, где в ряду всего 9 элементов. В принципе, идеальной является матрица 1*9, не так ли?

В принципе, да, и для этого reshape() вступает в игру. Это метод, который изменяет размеры оригинальной матрицы так, как хотелось бы нам.

Вот пример использования reshape() на практике.

A = [1, 2, 3, 4, 5, 6, 7, 8, 9]
A.reshape(1,9)
====================================================================
array([[1, 2, 3, 4, 5, 6, 7, 8, 9]])

Обратите внимание, что reshape возвращает многомерную матрицу. На это указывают две квадратных скобки в начале. [[1, 2, 3, 4, 5, 6, 7, 8, 9]] является потенциально многомерной матрицей в отличие от [1, 2, 3, 4, 5, 6, 7, 8, 9].

Другой пример:

B = [1, 2, 3, 4, 5, 6, 7, 8, 9]
B.reshape(3,3)
====================================================================
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

Если взять параметр shape для B, то им будет (3,3):

B.shape
====================================================================
(3,3)

Перейдем к np.zeros()

Что прописано в этом коде?

np.zeros((4,3))
====================================================================
???????????

Именно: здесь задана матрица формата 3*4, заполненная нулями. Вот вывод:

np.zeros((4,3))
====================================================================
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])

np.zeros((n,m)) возвращает матрицу формата n*m, заполненную нулями. Все просто.

А что делает np.eye()?

Возвращает нам единичную матрицу с определенными характеристиками.

np.eye(5)
====================================================================
array([[1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1.]])

Как умножить две матрицы?

Нет проблем: для этого используется np.dot(), Эта функция — скалярное произведение, если в нее передали вектора и произведение матриц (самое обыкновенное).

Пример: A = (2,3) & B = (3,2). Здесь число столбцов в А — 3. Число строк в В — 3. Поскольку характеристики совпадают, умножение возможно.

# generate an identity matrix of (3 x 3)
I = np.eye(3)
I
====================================================================
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

# generate another (3 x 3) matrix to be multiplied.
D = np.arange(1,10).reshape(3,3)
D
====================================================================
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

Мы подготовили матрицы к умножению. Далее — действуем.

# perform actual dot product.
M = np.dot(D,I)
M
====================================================================
array([[1., 2., 3.],
       [4., 5., 6.],
       [7., 8., 9.]])

А теперь давайте добавим отдельные элементы в матрицу

# add all the elements of matrix.
sum_val = np.sum(M)
sum_val
====================================================================
45.0

np.sum() добавляет элементы в матрицу.

Однако у нас есть два варианта.

1. Складываем по строкам

# sum along the rows
np.sum(M,axis=1)
====================================================================
array([ 6., 15., 24.])

6 — сумма первой строки (1, 2, 3).
15 — второй (4, 5, 6).
24 — третьей (7, 8, 9).

2. Складываем по столбцам

# sum along the cols
np.sum(M,axis=0)
====================================================================
array([12., 15., 18.])

12 — сумма по первому столбцу (1, 4, 7).
15 — по второму (2, 5, 7).
18 — по третьему (3, 6, 9).

Ниже — видео, созданное автором, где все, что описано выше, объясняется еще раз, более наглядно.

Skillbox рекомендует:

Автор: skillbox

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js