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

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

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

Канал сотрудничает с рекламным сервисом @Tgpodbor_official
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
Библиотека Numpy

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

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

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

#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 "Базовые операции"

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

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

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

#numpy