В Python: часть -1

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

Здесь я просто познакомлю вас с основами того, что в основном требуется для машинного обучения и науки о данных. Я не собираюсь описывать все, что возможно с библиотекой NumPy. Это первая часть серии руководств по NumPy.

Первое, с чем я хочу вас познакомить, это способ импорта.

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]

Хорошо, но почему я должен использовать массив np вместо обычного массива?

Ответ заключается в том, что массивы np лучше с точки зрения более быстрых вычислений и простоты манипулирования.

Подробнее об этих деталях здесь, если вам интересно:

Почему NumPy вместо списков Python?

https://numpy.org/devdocs/user/absolute_beginners.html

Давайте продолжим с более интересными вещами. Подождите, ничего крутого мы еще не видели! Хорошо, вот что:

np.arange()

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

Что делает arange([start],stop,[step]) , так это то, что он упорядочивает числа от начала до конца, шаг за шагом. Вот что это означает для np.arange(0,10,2):

вернуть список np, начиная с 0 и заканчивая 10, но не включать 10 и каждый раз увеличивать числа на 2.

Итак, вот что у нас получается:

array([0, 2, 4, 6, 8])

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

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

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

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

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

Теперь давайте поговорим о форме массива np по умолчанию.

Форма — это атрибут для массива np. Когда массив по умолчанию, скажем, например A, вызывается с формой, вот как это выглядит.

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

Это матрица ранга 1 (массив), в которой всего 9 элементов в строке.
В идеале это должна быть матрица 1 X 9, верно?

Я согласен с вами, так что здесь в игру вступает функция 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]])

Если я посмотрю на форму B, она будет (3,3):

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

Идеальный. Перейдем к np.zeros().

На этот раз ваша задача рассказать мне, что происходит, глядя на этот код:

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

Хорошо, если вы думали, что он напечатает матрицу 4 X 3, заполненную нулями. Вот результат:

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

np.zeros((n,m)) возвращает матрицу n x m, содержащую нули. Это так просто.

Давайте еще раз подумаем: что делает np.eye()?

Подсказка: eye() означает Identity.

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.eye() возвращает матрицу идентичности с указанными размерами.

Что если нам нужно перемножить 2 матрицы?

Нет проблем, у нас есть np.dot().

np.dot() выполняет умножение матриц при условии, что обе матрицы «умножаемы». Это просто означает, что количество столбцов первой матрицы должно совпадать с количеством строк во второй матрице.

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

Давайте проиллюстрируем умножение с помощью кода np:

# 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.]])

Большой! Теперь вы знаете, как просто и возможно перемножать матрицы! Также обратите внимание, что весь массив теперь имеет тип float.

Как насчет добавления элементов матрицы?

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

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

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

1. Суммируем по строкам.

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

6 - это сумма 1-й строки (1, 2, 3).

15 — это сумма 2-го ряда (4, 5, 6).

24 — это сумма 3-го ряда (7, 8, 9).

2. Суммируем по столбцам.

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

12 - это сумма 1-го столбца (1, 4, 7).

15 - это сумма 2-го столбца (2, 5, 8).

18 — это сумма 3-го столбца (3, 6, 9).