Python School
82.2K subscribers
2.42K photos
8 videos
578 links
Уроки по Python, которые упростят вам жизнь. Без идиотских туториалов.

Наши мемы для программистов: @conhum

Сотрудничество - @alivian

Канал сотрудничает с рекламным сервисом @Tgpodbor_official

РКН: clck.ru/3G6pBb
Download Telegram
Ускоряем код с помощью векторизации

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

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

По сути, vectorize преобразует функцию таким образом, что она начинает принимать весь вектор целиком, а не отдельный его элемент. Надо помнить, что такой подход не всегда приводит к значительному ускорению.

#vectorize #numpy
Библиотека Numpy

Преимущество и зачем использовать разобрали в предыдущем посте. Теперь углубим свои знания, а позже расскажем про pandas и интеграции с SQL.
Библиотеку требуется установить:

 install numpy

Для создания массива можно использовать методы array или empty. А вместо знакомого range() присутствует более быстрый arange.

Но помните, что использовать данный метод с типом float нужно осторожно из-за ограничения точности чисел с плавающей запятой. Обычно его заменяют методом linspace, который принимает не шаг, а кол-во нужных элементов.

#numpy
Библиотека Numpy "Базовые операции"

В Numpy очень просто реализованы простейшие операции: сложение, вычитание, умножение и деление. Единственное — для этого массивы должны быть одинаковыми.

Даже фильтрация возможна простейшим знаком. В массивах можно не перебирать через итератор filters, а просто поставить нужный знак.

Доступны так же математические операции: синус, косинус и подобные.

#numpy
Библиотека Numpy

При создании массивом мы получаем тип ndarray.

Рассмотрим наиболее часты атрибуты (не методы!) применимые к массивам:

ndim - число измерений (чаще их называют "оси") массива.

shape - размеры массива, его форма. Это кортеж натуральных чисел, показывающий длину массива по каждой оси. Для матрицы из n строк и m столбов, shape будет (n,m). Число элементов кортежа shape равно ndim.

size - количество элементов массива. Очевидно, равно произведению всех элементов атрибута shape.

dtype - объект, описывающий тип элементов массива

itemsize - размер каждого элемента массива в байтах.

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

#numpy
Библиотека Numpy

Надеемся, что вы плодотворно поработали с возможностями Numpy. Но красивый вывод вы явно не получили.

И, правда, выглядит вывод часто очень страшно, а вывести определенное кол-во элементов кажется проблемой. Но есть метод set_printoptions, который нужен для управления выводом.
Метод принимает следующие аргументы:

precision — количество отображаемых цифр после запятой (по умолчанию 8).

threshold — количество элементов в массиве, вызывающее обрезание элементов (по умолчанию 1000).

edgeitems — количество элементов в начале и в конце каждой размерности массива (по умолчанию 3).

linewidth — количество символов в строке, после которых осуществляется перенос (по умолчанию 75).

suppress — если True, не печатает маленькие значения в scientific notation (по умолчанию False).

nanstr — строковое представление NaN (по умолчанию 'nan').

infstr — строковое представление inf (по умолчанию 'inf').

#numpy
Библиотека Numpy

Сегодня коснемся важной темы -- срезов. Эта штука просто необходимый инструмент для обработки данных.

Способ очень похож на работу со списками. array[a:b], срезать с элемента a по элемент b. Вот только можно сразу использовать элементы, к примеру простейшие операции. Нельзя только удалять!

Срезы позволяют элегантно получать нужный столбец array[:, a], где a index нужного столбца.

#numpy
Библиотека Numpy

С многомерными массивами работать всегда сложнее. Например, если имеется огромный массив и требуется получить 1 индекс каждого вложенного списка начиная с 2, то мы пишем array[1:,2,:]. Однако, если нам надо залезть глубже, то придется добавить двоеточие. Но если нам надо самый последний вложенный, а вложений огромное множество?

Мы уже говорили про Ellipsis, он еще и очень полезен в Numpy. Огромное множество двоеточий можно заменить многоточием. Получается что:
array[1, 2, ...] эквивалентно array[1, 2, :, :, :], но мы сразу видим какая запись более короткая и понятная.

#numpy
Библиотека Numpy. Манипуляции с формой

Как
мы уже говорили у массива можно посмотреть его форму через атрибут shape. Но его можно изменить, вместе с этим изменится и форма массива. Как это работает?

Сначала массив будет приведен к одномерному, а после изменится так, как мы его зададим. Мы можем сделать массив одномерным через метод revel(). Аналогом изменения атрибута служит метод reshape()

Еще один метод для манипуляции с формой - transpose(). Он берет столбы и превращает в строки.

#numpy
Библиотека Numpy. Объединение массивов

В данных нужно не только изменять форму, но и объединять с другими данными. Numpy позволяет при помощи различных методов очень удобно объединять массивы. К примеру, по осям.

Для объединения используется методы:

hstack - объединяет массивы по первым осям
vstack - объединяет массивы по последним осям

Есть абсолютно такие же методы (привели другое более понятное описание, но методы идентичны согласно официальной документации):

column_stack - объединяет столбцы в строки
row_stack - объединяет строки в столбцы

Если вам не совсем понятно, то посмотрите на пример кода и протестируйте методы сами.
#numpy
Библиотека Numpy. Разбиение массива

В прошлом посте разобрали объединение массивов. Но кроме этого, их приходится еще и делить. Разумеется, нам нужно не банальное деление через срезы, а более гибкое. Для этого в Numpy представлено два метода:

hsplit - разбивает вдоль горизонтальной оси
vsplit - разбивает вдоль вертикальной оси
array_split - более общий, он позволяет указать вдоль какой оси произойдет разбиение.

#numpy
Библиотека Numpy. Копии и представления

Ранее мы уже говорили про такую проблему со списками, когда при присваивании новой переменной и последующем изменении изначальный список тоже меняется. Такая же ситуация происходит и в numpy. По умолчанию мы не создаем новый объект, а лишь передаем ссылку на него.

Поскольку Numpy более гибкий, то и инструментов у него больше:
Представление (поверхностное копирование) и глубокое копирование.

Представление - позволяет как угодно изменять форму, но при изменении данных меняются данные и у изначального массива. Можно получить через срез.

Глубокое копирование - создается новый объект, который не имеет ничего общего со старым (кроме набора данных, но хранятся они уже в разных ячейках памяти)

#numpy