Примечания к выпуску NumPy 1.22.0#

NumPy 1.22.0 — это крупный выпуск, включающий работу 153 участников, распределенных по 609 запросам на слияние. Было много улучшений, основные моменты:

  • Аннотации основного пространства имен по сути завершены. Исходный код является движущейся целью, поэтому, вероятно, будут дальнейшие улучшения, но основная работа выполнена. Это, вероятно, наиболее заметное для пользователей улучшение в этом выпуске.

  • Предоставлена предварительная версия предлагаемого Array-API. Это шаг к созданию стандартного набора функций, которые можно использовать в таких приложениях, как CuPy и JAX.

  • NumPy теперь имеет бэкенд DLPack. DLPack предоставляет общий формат обмена для данных массивов (тензоров).

  • Новые методы для quantile, percentileи связанные функции. Новые методы предоставляют полный набор методов, обычно встречающихся в литературе.

  • Универсальные функции были переработаны для реализации большей части NEP 43Это также открывает возможность экспериментировать с будущим API типов данных (DType API).

  • Новый настраиваемый аллокатор для использования в сторонних проектах.

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

Поддерживаемые версии Python в этом выпуске: 3.8-3.10, Python 3.7 был удалён. Обратите внимание, что Mac wheels теперь основаны на OS X 10.14, а не на 10.9, которые использовались в предыдущих циклах выпуска NumPy. 10.14 — это самая старая версия, поддерживаемая Apple. Также обратите внимание, что 32-битные wheels предоставляются только для Python 3.8 и 3.9 на Windows, все остальные wheels — 64-битные из-за того, что Ubuntu, Fedora и другие дистрибутивы Linux отказались от поддержки 32-битных систем. Все 64-битные wheels также связаны с 64-битным целочисленным OpenBLAS, что должно исправить случайные проблемы, с которыми сталкиваются пользователи, работающие с действительно огромными массивами.

Устаревшие устаревания#

Устаревшие строковые обозначения dtype в числовом стиле были удалены#

Используя строки "Bytes0", "Datetime64", "Str0", "Uint32", и "Uint64" как dtype теперь вызовет TypeError.

(gh-19539)

Устаревшие уведомления об устаревании для loads, ndfromtxt, и mafromtxt в npyio#

numpy.loads был устаревшим в v1.15, с рекомендацией пользователям использовать pickle.loads вместо этого. ndfromtxt и mafromtxt были устаревшими в v1.17 - пользователям следует использовать numpy.genfromtxt вместо этого с соответствующим значением для usemask параметр.

(gh-19615)

Устаревшие функции#

Используйте delimiter вместо delimitor в качестве ключевого аргумента в mrecords#

Неправильно написанный аргумент ключевого слова delimitor of numpy.ma.mrecords.fromtextfile() был изменён на delimiter, использование будет вызывать предупреждение об устаревании.

(gh-19921)

Передача булевых kth значения для (arg-)partition устарели#

numpy.partition и numpy.argpartition ранее принимал логические значения для kth параметр, который впоследствии будет преобразован в целые числа. Это поведение теперь устарело.

(gh-20000)

The np.MachAr класс был устаревшим#

The numpy.MachAr класс и finfo.machar атрибут устарел. Пользователям рекомендуется обращаться к интересующему свойству напрямую из соответствующего numpy.finfo атрибут.

(gh-20201)

Примечания по совместимости#

Distutils принудительно устанавливает строгую модель с плавающей точкой на clang#

NumPy теперь устанавливает -ftrapping-math опция в clang для обеспечения правильной обработки ошибок с плавающей точкой для универсальных функций. Clang по умолчанию использует не-IEEE и соответствующее поведение C99 в противном случае. Это изменение (используя эквивалентную, но более новую -ffp-exception-behavior=strict) была предпринята в NumPy 1.21, но фактически никогда не использовалась.

(gh-19479)

Удалена поддержка целочисленного деления для комплексных типов#

Целочисленное деление комплексных типов теперь будет давать TypeError

>>> a = np.arange(10) + 1j* np.arange(10)
>>> a // 1
TypeError: ufunc 'floor_divide' not supported for the input types...

(gh-19135)

numpy.vectorize функции теперь производят тот же выходной класс, что и базовая функция#

Когда функция, которая учитывает numpy.ndarray подклассы векторизуются с использованием numpy.vectorize, векторизованная функция теперь также будет безопасна для подклассов в случаях, когда задана сигнатура (т.е. при создании gufunc): класс выходных данных будет таким же, как и возвращенный первым вызовом базовой функции.

(gh-19356)

Python 3.7 больше не поддерживается#

Поддержка Python была прекращена. Это довольно строго, есть изменения, требующие Python >= 3.8.

(gh-19665)

str/repr комплексных типов данных теперь включает пробел после знаков препинания#

Представление (repr) объекта np.dtype({"names": ["a"], "formats": [int], "offsets": [2]}) теперь dtype({'names': ['a'], 'formats': [' 'offsets': [2], 'itemsize': 10})тогда как пробелы ранее опускались после двоеточий и между полями.

Старое поведение можно восстановить с помощью np.set_printoptions(legacy="1.21").

(gh-19687)

Исправлено advance в PCG64DSXM и PCG64#

Исправлена ошибка в advance метод PCG64DSXM и PCG64. Ошибка влияет только на результаты, когда шаг был больше \(2^{64}\) на платформах, которые не поддерживают 128-битные целые числа (например, Windows и 32-битный Linux).

(gh-20049)

Изменение в генерации случайных 32-битных чисел с плавающей запятой#

Была ошибка в генерации 32-битных значений с плавающей точкой из равномерного распределения, которая приводила к тому, что младший значащий бит случайной величины всегда был равен 0. Это исправлено.

Это изменение влияет на варианты, создаваемые random.Generator методы random, standard_normal, standard_exponential, и standard_gamma, но только когда dtype указан как numpy.float32.

(gh-20314)

Изменения в C API#

Маскированные внутренние циклы больше нельзя настраивать#

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

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

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

(gh-19259)

Экспериментальное представление будущего API DType и UFunc#

Новый заголовок experimental_public_dtype_api.h позволяет экспериментировать с будущим API для улучшенной поддержки универсальных функций и особенно пользовательских типов данных. В настоящее время рекомендуется экспериментировать с использованием версии для разработки NumPy, поскольку ожидаются некоторые изменения и будут разблокированы новые функции.

(gh-19919)

Новые возможности#

NEP 49 настраиваемые аллокаторы#

Как подробно описано в NEP 49, функция, используемая для выделения сегмента данных ndarray, может быть изменена. Политика может быть установлена глобально или в контексте. Для получения дополнительной информации см. NEP и Управление памятью в NumPy документация по ссылкам. Также добавьте NUMPY_WARN_IF_NO_MEM_POLICY переопределить для предупреждения об опасном использовании передачи владения путем установки NPY_ARRAY_OWNDATA.

(gh-17582)

Реализация NEP 47 (принятие стандарта API массивов)#

Начальная реализация NEP 47 (принятие стандарта array API) был добавлен как numpy.array_api. Реализация является экспериментальной и будет выдавать предупреждение UserWarning при импорте, так как стандарт API массивов все еще находится в черновом состоянии. numpy.array_api является соответствующей реализацией стандарта API массивов, которая также минимальна, то есть реализованы только те функции и поведения, которые требуются стандартом (см. NEP для получения дополнительной информации). Библиотекам, желающим использовать стандарт API массивов, рекомендуется использовать numpy.array_api чтобы проверить, что они используют только функциональность, которая гарантированно присутствует в стандартных соответствующих реализациях.

(gh-18585)

Теперь возможно генерировать справочную документацию по API C/C++ из блоков комментариев#

Эта функция зависит от Doxygen в процессе генерации и на Breathe для интеграции с Sphinx.

(gh-18884)

Назначьте специфичную для платформы c_intp точность через плагин mypy#

The mypy плагин, представленный в numpy/numpy#17843, снова расширен: плагин теперь отвечает за установку платформенно-специфичной точности для numpy.ctypeslib.c_intp, последний используется как тип данных для различных numpy.ndarray.ctypes атрибуты.

Без плагина, указанный тип по умолчанию будет ctypes.c_int64.

Чтобы включить плагин, необходимо добавить его в свой mypy файл конфигурации:

[mypy]
plugins = numpy.typing.mypy_plugin

(gh-19062)

Добавить поддержку dlpack, совместимую с NEP 47#

Добавить ndarray.__dlpack__() метод, который возвращает dlpack C структура, обёрнутая в PyCapsule. Также добавьте np._from_dlpack(obj) функция, где obj поддерживает __dlpack__()и возвращает ndarray.

(gh-19083)

keepdims необязательный аргумент добавлен в numpy.argmin, numpy.argmax#

keepdims аргумент добавляется к numpy.argmin, numpy.argmax. Если установлено в True, оси, которые сокращаются, остаются в результате как размерности с размером один. Результирующий массив имеет то же количество измерений и будет транслироваться с входным массивом.

(gh-19211)

bit_count для вычисления количества единичных битов в целом числе#

Вычисляет количество 1-битов в абсолютном значении входных данных. Работает со всеми целочисленными типами numpy. Аналогично встроенной функции int.bit_count или popcount в C++.

>>> np.uint32(1023).bit_count()
10
>>> np.int32(-127).bit_count()
7

(gh-19355)

The ndim и axis атрибуты были добавлены к numpy.AxisError#

The ndim и axis параметры теперь также хранятся как атрибуты внутри каждого numpy.AxisError экземпляр.

(gh-19459)

Предварительная поддержка для windows/arm64 цель#

numpy добавлена поддержка цели windows/arm64. Обратите внимание OpenBLAS поддержка пока недоступна для цели windows/arm64.

(gh-19513)

Добавлена поддержка LoongArch#

LoongArch — это новый набор инструкций, сбой компиляции numpy на архитектуре LoongArch, поэтому добавлен коммит.

(gh-19527)

A .clang-format файл был добавлен#

Clang-format — это форматировщик кода C/C++, вместе с добавленным .clang-format файл, он генерирует код, достаточно близкий к руководству по стилю C NumPy для общего использования. Требуется Clang-format версии 12+ из-за использования нескольких новых функций; он доступен в Fedora 34 и Ubuntu Focal, среди других дистрибутивов.

(gh-19754)

is_integer теперь доступен для numpy.floating и numpy.integer#

Основано на его аналоге в Python float и int, типы с плавающей точкой и целые числа numpy теперь поддерживают float.is_integer. Возвращает True если число конечно и имеет целочисленное значение, False в противном случае.

>>> np.float32(-2.0).is_integer()
True
>>> np.float64(3.2).is_integer()
False
>>> np.int32(-2).is_integer()
True

(gh-19803)

Символьный парсер для спецификаций размерности Fortran#

В f2py добавлен новый синтаксический анализатор для корректного разбора спецификаций размерностей. Анализатор является основой для будущих улучшений и обеспечивает совместимость с черновиком Fortran 202x.

(gh-19805)

ndarray, dtype и number теперь доступны для подписки во время выполнения#

Имитация PEP 585, numpy.ndarray, numpy.dtype и numpy.number классы теперь поддерживают индексацию для Python 3.9 и выше. Следовательно, выражения, которые ранее были разрешены только в файлах заглушек .pyi или с помощью from __future__ import annotations теперь также допустимы во время выполнения.

>>> import numpy as np
>>> from typing import Any

>>> np.ndarray[Any, np.dtype[np.float64]]
numpy.ndarray[typing.Any, numpy.dtype[numpy.float64]]

(gh-19879)

Улучшения#

ctypeslib.load_library теперь может принимать любой объект, подобный пути#

Все параметры в теперь могут принимать любой объект, подобный пути. Это включает такие типы, как строки, байты и объекты, реализующие __fspath__ протокол.

(gh-17530)

Добавить smallest_normal и smallest_subnormal атрибуты к finfo#

Атрибуты smallest_normal и smallest_subnormal доступны как расширение finfo класс для любого типа данных с плавающей запятой. Чтобы использовать эти новые атрибуты, напишите np.finfo(np.float64).smallest_normal или np.finfo(np.float64).smallest_subnormal.

(gh-18536)

numpy.linalg.qr принимает уложенные матрицы в качестве входных данных#

numpy.linalg.qr способен выдавать результаты для стековых матриц в качестве входных данных. Кроме того, реализация QR-разложения была перенесена из Python в C.

(gh-19151)

numpy.fromregex теперь принимает os.PathLike реализации#

numpy.fromregex теперь принимает объекты, реализующие __fspath__ протокол, например, pathlib.Path.

(gh-19680)

Добавить новые методы для quantile и percentile#

quantile и percentile теперь имеют method= аргумент ключевого слова, поддерживающий 13 различных методов. Это заменяет interpolation= аргумент ключевого слова.

Методы теперь выровнены с девятью методами, которые можно найти в научной литературе и языке R. Оставшиеся методы — это предыдущие разрывные вариации метода по умолчанию “linear”.

Пожалуйста, ознакомьтесь с документацией numpy.percentile для получения дополнительной информации.

(gh-19857)

Отсутствующие параметры были добавлены к nan функции#

Ряд из nan функции ранее не имели параметров, которые присутствовали в их -based аналог, например, the where параметр был присутствует в numpy.mean но отсутствует в numpy.nanmean.

Следующие параметры теперь добавлены в nan функции:

  • nanmin: initial & where

  • nanmax: initial & where

  • nanargmin: keepdims & out

  • nanargmax: keepdims & out

  • nansum: initial & where

  • nanprod: initial & where

  • nanmean: where

  • nanvar: where

  • nanstd: where

(gh-20027)

Аннотация основного пространства имен Numpy#

Начиная с релиза 1.20, аннотации типов PEP 484 были включены для частей библиотеки NumPy; аннотирование оставшихся функций является работой в процессе. С выпуском 1.22 этот процесс был завершён для основного пространства имён NumPy, которое теперь полностью аннотировано.

Помимо основного пространства имён, ограниченное количество подпакетов также содержит аннотации. Среди прочих, это включает numpy.testing, numpy.linalg и numpy.random (доступно с версии 1.21).

(gh-20217)

Векторизация модуля umath с использованием AVX-512#

Используя Intel Short Vector Math Library (SVML), 18 функций umath (exp2, log2, log10, expm1, log1p, cbrt, sin, cos, tan, arcsin, arccos, arctan, sinh, cosh, tanh, arcsinh, arccosh, arctanh) векторизованы с использованием набора инструкций AVX-512 как для одинарной, так и для двойной точности. Это изменение в настоящее время включено только для пользователей Linux и на процессорах с набором инструкций AVX-512. Оно обеспечивает среднее ускорение в 32x и 14x для функций одинарной и двойной точности соответственно.

(gh-19478)

OpenBLAS v0.3.18#

Обновление OpenBLAS, используемого в тестировании и в колесах, до v0.3.18

(gh-20058)