Начальные функции NumPy

Всем доброго времени суток! Сегодня мы посмотрим на основные операции с массивами NumPy и создадим «шпаргалку», которой вы сможете быстро пользоваться.

Подпишись на группу Вконтакте и Телеграм-канал. Там еще больше полезного контента для программистов.

А на моем YouTube-канале ежедневно по будням проходят обучающие стримы по программированию. Подписывайся!

Предисловие

Python становится все популярнее и популярнее. Много людей начинают изучать этот язык и встречают на своё пути библиотеку NumPy (сокр. от Numeric Python, невозможно учить python и не знать про эту библиотеку). Она насчитывает в себе множество различных функций и подмодулей, потому запомнить всё просто напросто невозможно. Сегодня мы запишем примеры использования различных базовых конструкций относительно главного класса Numpynp.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 и brandint(a, b):

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

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

Дополнение

Все арифметические операции в NumPy осуществляются поэлементно:

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

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

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

Опять же, это не in-place метод, он возвращает новый массив.

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

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

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

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

Заключение

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

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