Новый Numpy 1.20.0 — что туда завезли и стоит ли обновлять?

Друзья, только недавно вышел новый релиз Numpy 1.20.0 и самое время обсудить, что туда завезли интересного.

Само собой, обсуждать будем не все — иначе мы просто с головой погрязнем в изучении доки. Публикуем только самое интересное (на наш скромный и неправильный взгляд). Если Вы для себя выделяете еще что-то важное, о чем мы не упомянули — поделитесь в комментариях!

Итак, приступим.

Новые функции

В классе random.Generator появилась новая функция permuted.

Она отличается от shuffle и permutation. Старые функции воспринимали входные данные как 1Dмассив и обрабатывали его также. Новая функция permuted же позволяет, например, независимо перемешать элементы 2D массива.

sliding_window_view дает возможность использовать скользящие окна для массивов numpy

Оконные функции — актуальный вопрос и многие смежные библиотеки давно в них нуждались (а у некоторых даже есть свои реализации — см. skimage.utils.view_as_windows()). Это позволит облегчить реализации некоторых алгоритмов, например, скользящего среднего.

Новая функция numpy.broadcast_shapes

Функция numpy.broadcast_shapes принимает на вход кортежи с размерностями исходных массивов и возвращает результат — какая будет итоговая форма результирующего массива после броадкастинга всех заданных форм друг с другом.

>>> np.broadcast_shapes((1, 2), (3, 1))
(3, 2)

>>> np.broadcast_shapes(2, (3, 1))
(3, 2)

>>> np.broadcast_shapes((6, 7), (5, 6, 1), (7,), (5, 1, 7))
(5, 6, 7)

Подробнее про броадкастинг (broadcasting) можно почитать здесь.

Кстати говоря, если полазить в исходниках на Github, можно найти много забавного. Вот, например:

aaccdbec2e99a20d9ac606d9aab2f4a4.png

Что уходит в прошлое?

А теперь давайте обсудим, что уходить в прошлое и is deprecated, как говорят в народе.

Использование алиасов для встроенных типов

Чтобы не вызывать конфузов у новичков, алиасы для встроенных типов, например, np.int иint отправлены на пенсию. Вот полная таблица с изменениями:

f741c8e56117ab2655e40cf077c0630f.png

Вызов numpy.dual

Модуль numpy.dual отправлен на пенсию. Вместо импортирования функция из него, их следует импортировать напрямую из numpy и scipy.

Финансовые функции

Финансовые функции убрали из Numpy 1.20. Следующие функции доступны в библиотеке numpy_financial: fv, ipmt, irr, mirr, nper, npv, pmt, ppmt, pv, rate.

Новые фичи

Аргумент where для all и any

Добавлен аргумент where, который позволяет работать только с определенными элементами и размерностями массивов в all и any.

Например:

>>> np.all([[True, True], [False, True]])
False

>>> np.all([[True, True], [False, True]], where=[[True], [False]])
True

Аргумент where для mean, str, var

Аналогично предыдущему случаю, для функций mean, std, var добавлен аргумент where, который позволяет обрабатывать только часть исходных массивов и сокращать вычисления.

Например:

>>> a = np.array([[5, 9, 13], [14, 10, 12], [11, 15, 19]]) 
>>> np.mean(a) 

12.0 

>>> np.mean(a, where=[[True], [False], [False]]) 

9.0

Изменения

np.linspace с целыми числами теперь использует floor

Раньше, используя np.linspace с целыми числами (int), округление дробей производилось относительно нуля, что влияло на результат с отрицательными числами:

>>> np.linspace(-3, 1, 8, dtype=int)
array([-3, -2, -1, -1,  0,  0,  0,  1])

Теперь округление производится относительно -\infty, что дает более логичный результат:

>>> np.linspace(-3, 1, 8, dtype=int)
array([-3, -3, -2, -2, -1, -1,  0,  1])

Эпилог

Полный перечень изменений Вы можете посмотреть в официальном релизе. И не забудьте погулять по документации и Github, потому что из описания далеко не всегда все понятно. Ну, и конечно, не забываем все это дело пробовать на практике — вдруг что-то не работает :)

Кстати говоря, уже есть случаи, когда обновление Numpy до версии 1.20 вызвало сложности с поддержкой предыдущего кода. Кто-то уже встречался с таким? Пишите в комментариях, давайте обменяемся опытом по этому вопросу. Не каждый день все-таки обновления выходят, тем более такие крупные.

© Habrahabr.ru