Всем доброго времени суток! Сегодня мы посмотрим на основные операции с массивами NumPy и создадим «шпаргалку», которой вы сможете быстро пользоваться.
Подпишись на группу Вконтакте и Телеграм-канал. Там еще больше полезного контента для программистов.
А на моем YouTube-канале ежедневно по будням проходят обучающие стримы по программированию. Подписывайся!
Предисловие
Python становится все популярнее и популярнее. Много людей начинают изучать этот язык и встречают на своё пути библиотеку NumPy (сокр. от Numeric Python, невозможно учить python и не знать про эту библиотеку). Она насчитывает в себе множество различных функций и подмодулей, потому запомнить всё просто напросто невозможно. Сегодня мы запишем примеры использования различных базовых конструкций относительно главного класса Numpy — np.ndarray.
Массивы numpy много где используются: Scipy, matplotlib, Pandas (и других библиотеках, составляющих основной инструментарий data scientist’a) и т.д., потому навык владения ими очень важен для Python разработчика.
В качестве среды разработки использован Jupyter Notebook.
Начало работы c NumPy
Начнём работу с импортирования NumPy и создания обычного одномерного массива. Мы будем работать только с числовыми типами, однако в массивах можно хранить любые значения одного типа. Массивы numpy отличаются от списков в плане удаления/добавления элементов (в виду того, что список — динамический массив), а от array.array оптимизированными операциями из-за внутренней реализации (её описание выходит за рамки этой статьи).

Примечание. Вообще не существуетобщепринятых правил по поводу импортирования различных модулей с помощью конструкции as, однако большинство профессиональных разработчиков приняли сокращение np относительно NumPy. Мы ничем не хуже, потому будем делать так же.
Как мы видим, в «конструктор» класса мы передаем обычный список. Другие способы создания массива мы рассмотрим позже.
Базовые методы NymPy
У массива numpy есть много методов, которые есть аналогами встроенных функций Python. Один из них — sum.

Также мы можем найти среднее арифметическое всех элементов массива:

Примечание. Как вы можете заметить, даже если элемента массива имеют тип int, среднее арифметическое массива будет иметь тип float.
min() и max() — где-то мы уже видели это:

sort() — делает то же самое, что и аналогичный метод списка python:

Теперь что-то новенькое. Мы можем узнать «форму» массива — его размерность. У нас одномерный массив с пятью элементами, что и показывает вывод блока ниже:

Также у массива numpy имеется куча методов по преобразованию в различные виды последовательностей, наиболее популярными являются tolist() — преобразование в список, и tostring() — преобразование в строку байтов.

Булевы массивы
Булевы массивы — массивы, элементами которых являются значения True/False. В NumPy такие массивы появляются при любых операциях, которые в Python’е возвращают bool (a < b, c != d и т.д.), т.к. все операции numpy работают векторизированно (поэлементно).
Например, сравним массив с числом 3 :

Получаем новые булевы массивы. Их мы сможем использовать для выбора по маске.
Примечание. Подобные штуки реализуются с помощью перегрузки операторов, в данном случае __gt__(self, other) и __lt__(self, other).
Выбор по маске — отбор элементов массива по определённому признаку. В NumPy он осуществляется с помощью передачи булевого массива в квадратные скобки (конструкция индексирования или среза). Оба массива должны иметь одинаковую форму.
Выберем только те элементы массива, которые больше трех:

Прошу заметить, что возвращается новый массив, а не изменяется первоначальный.
Не всё так просто
Работа с одномерными и многомерными массивами во многом отличается. Продемонстрирую это на примере двухмерного массива:

Форма массива — 3 под-массива с тремя элементами в каждом:

Мы можем передать аргумент axis в различные функции, чтобы обратить их действие на «столбцы» матрицы:

Однако среднее арифметическое так же может работать, как обычно:

У массива есть поле T (transposed) — «перевёрнутая» (столбцы и строки меняются местами) его версия:

Также есть поле flat — одномерная версия массива (join использован для удобного представления возвращаемых итераторов чисел):

Массивы NumPy поддерживают многомерные срезы:

Конечный индекс не входит в срез, так же как и в стандартном Python.
Мы также можем изменять форму массива с помощью метода resize(), однако он возвращает новый массив, а не изменяет первоначальный, так как это делает b.shape = (…, …).

Различные методы создания массивов
В этом разделе я продемонстрирую результат работы двух функций — arange() и linspace().

linspace() принимает три параметра — нижний порог, верхний порог и общее кол-во элементов последовательности (включая пороги, распределяются они равномерно). Как мы можем увидеть, верхний порог спокойно может входить в исходный массив.

arange() тоже принимает нижний и верхний порог, а так же шаг (по умолчанию 1), как и функция range().
Numpy.Random
У NumPy есть подмодуль random, который отвечает за случайную генерацию данных, их перемешивание и т.д. Много аналогов этих функций есть в модуле стандартной библиотеки Python — random.
Если вам нужно перемешать массив — функция shuffle() приходит на помощь:

Случайное число между 0 и 1 — rand():

Случайное целое число между a и b — randint(a, b):

N случайных целых чисел между а и b — random_integers(a, b, N):

Это далеко не полный перечень функций random, однако на первое время этого хватит.
Дополнение
Все арифметические операции в NumPy осуществляются поэлементно:

Имеется куча встроенных мат.функций, например, гиперболический тангенс:

Узнать тип данных массива:

Поменять его:

Опять же, это не in-place метод, он возвращает новый массив.
a.argmax() — возвращает индекс максимального элемента в массиве, a.argmin() делает противоположное:

Уникальные значения массива с помощью unique():

Диагональ двухмерного массива:

Матричное умножение:

Заключение
Сегодня мы рассмотрели основы работы с массивами NumPy. Здесь не перечислен наверно даже 1% возможности этой библиотеки, однако задав начало, вам будет легче ориентироваться в документации и различных фрагментах кода, что увеличит ваш темп обучения.
Также рекомендую прочитать статью Сериализация объектов в Python и подпишитесь на группу ВКонтакте,Телеграм и YouTube-канал. Там еще больше полезного и интересного для разработчиков.