Борьба с числами? Пусть NumPy решит проблему.

Введение

NumPy — это пакет Python, разработанный для научных вычислений. Он использует множество математических формул, связанных с подполями математики, такими как линейная алгебра, статистика и так далее. Есть два важных факта, которые большинство людей в сообществе Data Science и Machine Learning не знают о NumPy;

  1. NumPy делает Python чрезвычайно быстрым.
  2. Если вы специалист по данным или специалисту по машинному обучению, большую часть времени вы не будете работать с NumPy напрямую.

Ну, вы можете спросить "почему?"

Массивы NumPy работают быстрее, чем списки Python, потому что:

  • Прежде всего, массив — это набор однородных типов данных, которые хранятся в смежных блоках памяти. И наоборот, список в Python представляет собой набор разнородных типов данных, хранящихся в несмежных блоках памяти.
  • Во-вторых, пакет NumPy разбивает задачу на несколько фрагментов, а затем обрабатывает все фрагменты параллельно.
  • И последнее, но не менее важное: пакет NumPy интегрирует коды C, C++ и Fortran в Python. Поскольку эти языки программирования являются низкоуровневыми (у них нет автоматического управления памятью), их время выполнения очень мало по сравнению с Python.

См. пример ниже, где я иллюстрирую сравнение времени выполнения между списком Python и массивом NumPy;

"Почему мы работаем с NumPy косвенно?"

Если вы не занимаетесь прикладной математикой или статистикой, вам потребуется визуализировать табличную форму и манипулировать данными с помощью пакета Pandas. Это процедура, которую вам нужно будет выполнить, чтобы выполнить необходимую предварительную обработку данных. Pandas определяется как библиотека с открытым исходным кодом, обеспечивающая высокопроизводительную обработку данных в Python.

Он построен на основе пакета NumPy, что означает, что Numpy требуется для работы Pandas. Название Pandas происходит от слова Panel Data, что означает эконометрику из многомерных данных.

Полезные функции NumPy

import numpy as np

1. np.argmax()

Возвращает индексы максимальных значений по оси. При вводе np.argmax() нажмите SHIFT+TAB, чтобы просмотреть строку документации.

Пример:

Сначала мы создаем двумерный массив, чтобы найти argmax() массива.

a = np.arange(6).reshape(2,3) + 10
a

Вывод выглядит следующим образом:

array([[10, 11, 12],
       [13, 14, 15]])

Если мы передадим массив a в качестве аргумента в np.argmax(), мы получим следующий вывод:

np.argmax(a)
Output: 5

2. нп.тенсордот ()

Вычислите скалярное произведение тензора вдоль заданных осей. Если вы откроете строку документации, вы увидите этот пример;

Имея два тензора, a и b, и объект array_like, содержащий
два объекта array_like, `(a_axes, b_axes)`, суммируйте произведения
элементов (компонентов) a и b по осям, указанным < br /> `a_axes` и `b_axes`. Третьим аргументом может быть один неотрицательный
целочисленный скаляр, ``N``; если это так, то последние ``N`` измерений
`a` и первые ``N`` измерений `b` суммируются.

a = np.arange(60.).reshape(3,4,5)
>>> b = np.arange(24.).reshape(4,3,2)
>>> c = np.tensordot(a,b, axes=([1,0],[0,1]))
>>> c.shape
(5, 2)
>>> c
array([[4400., 4730.],
       [4532., 4874.],
       [4664., 5018.],
       [4796., 5162.],
       [4928., 5306.]])
>>> # A slower but equivalent way of computing the same...
>>> d = np.zeros((5,2))
>>> for i in range(5):
...   for j in range(2):
...     for k in range(3):
...       for n in range(4):
...         d[i,j] += a[k,n,i] * b[n,k,j]
>>> c == d
Output: array([[ True,  True],
       [ True,  True],
       [ True,  True],
       [ True,  True],
       [ True,  True]])

An extended example taking advantage of the overloading of + and \*:

>>> a = np.array(range(1, 9))
>>> a.shape = (2, 2, 2)
>>> A = np.array(('a', 'b', 'c', 'd'), dtype=object)
>>> A.shape = (2, 2)
>>> a; A
Output: array([[[1, 2],
        [3, 4]],
       [[5, 6],
        [7, 8]]])
array([['a', 'b'],
       ['c', 'd']], dtype=object)

>>> np.tensordot(a, A) # third argument default is 2 for double-contraction
Output: array(['abbcccdddd', 'aaaaabbbbbbcccccccdddddddd'], dtype=object)

>>> np.tensordot(a, A, 1)
Output: array([[['acc', 'bdd'],
        ['aaacccc', 'bbbdddd']],
       [['aaaaacccccc', 'bbbbbdddddd'],
        ['aaaaaaacccccccc', 'bbbbbbbdddddddd']]], dtype=object)

>>> np.tensordot(a, A, 0) # tensor product (result too long to incl.)
Output: array([[[[['a', 'b'],
          ['c', 'd']],
          ...

>>> np.tensordot(a, A, (0, 1))
Output: array([[['abbbbb', 'cddddd'],
        ['aabbbbbb', 'ccdddddd']],
       [['aaabbbbbbb', 'cccddddddd'],
        ['aaaabbbbbbbb', 'ccccdddddddd']]], dtype=object)

>>> np.tensordot(a, A, (2, 1))
Output: array([[['abb', 'cdd'],
        ['aaabbbb', 'cccdddd']],
       [['aaaaabbbbbb', 'cccccdddddd'],
        ['aaaaaaabbbbbbbb', 'cccccccdddddddd']]], dtype=object)

>>> np.tensordot(a, A, ((0, 1), (0, 1)))
Output: array(['abbbcccccddddddd', 'aabbbbccccccdddddddd'], dtype=object)

>>> np.tensordot(a, A, ((2, 1), (1, 0)))
Output: array(['acccbbdddd', 'aaaaacccccccbbbbbbdddddddd'], dtype=object)

3. нп.квантиле()

Вычислите q-й квантиль данных вдоль указанной оси.

>>> a = np.array([[10, 7, 4], [3, 2, 1]])
>>> a
Output: array([[10,  7,  4],
       [ 3,  2,  1]])
>>> np.quantile(a, 0.5)
3.5
>>> np.quantile(a, 0.5, axis=0)
Output: array([6.5, 4.5, 2.5])
>>> np.quantile(a, 0.5, axis=1)
Output: array([7.,  2.])
>>> np.quantile(a, 0.5, axis=1, keepdims=True)
Output: array([[7.],
       [2.]])
>>> m = np.quantile(a, 0.5, axis=0)
>>> out = np.zeros_like(m)
>>> np.quantile(a, 0.5, axis=0, out=out)
Output: array([6.5, 4.5, 2.5])
>>> m
Output: array([6.5, 4.5, 2.5])
>>> b = a.copy()
>>> np.quantile(b, 0.5, axis=1, overwrite_input=True)
Output: array([7.,  2.])

4. нп.стд()

Вычислите стандартное отклонение вдоль указанной оси. Возвращает стандартное отклонение, меру разброса распределения,
элементов массива. Стандартное отклонение вычисляется для
сглаженного массива по умолчанию, в противном случае по указанной оси.

Пример:

>>> a = np.array([[1, 2], [3, 4]])
>>> np.std(a)
Output: 1.1180339887498949 # may vary
>>> np.std(a, axis=0)
Output: array([1.,  1.])
>>> np.std(a, axis=1)
Output: array([0.5,  0.5])

5. нп.медиана ()

Вычислить медиану вдоль указанной оси. Возвращает медиану элементов массива.

>>> a = np.array([[10, 7, 4], [3, 2, 1]])
>>> a
Output: array([[10,  7,  4],
       [ 3,  2,  1]])
>>> np.median(a)
3.5
>>> np.median(a, axis=0)
Output: array([6.5, 4.5, 2.5])
>>> np.median(a, axis=1)
Output: array([7.,  2.])
>>> m = np.median(a, axis=0)
>>> out = np.zeros_like(m)
>>> np.median(a, axis=0, out=m)
Output: array([6.5,  4.5,  2.5])
>>> m
Output: array([6.5,  4.5,  2.5])
>>> b = a.copy()
>>> np.median(b, axis=1, overwrite_input=True)
Output: array([7.,  2.])
>>> assert not np.all(a==b)
>>> b = a.copy()
>>> np.median(b, axis=None, overwrite_input=True)
3.5