Примечания к выпуску NumPy 1.21.0#
Основные моменты выпуска NumPy 1.21.0:
продолжение работы над SIMD, охватывающее больше функций и платформ,
начальная работа над новой инфраструктурой типов данных и приведением типов,
универсальные колеса (wheels) для Python 3.8 и Python 3.9 на Mac,
улучшенная документация,
улучшенными аннотациями,
новый
PCG64DXSMгенератор битов для случайных чисел.
Кроме того, присутствует обычное большое количество исправлений ошибок и других улучшений.
Версии Python, поддерживаемые в этом выпуске: 3.7-3.9. Официальная поддержка Python 3.10 будет добавлена после его выпуска.
Предупреждение
Существуют нерешенные проблемы при компиляции NumPy 1.20.0 с gcc-11.1.
Уровень оптимизации -O3 приводит ко многим некорректным предупреждениям при запуске тестов.
На некотором оборудовании NumPY зависает в бесконечном цикле.
Новые функции#
Добавить PCG64DXSM BitGenerator#
Использование PCG64 BitGenerator В контексте массового параллелизма были
показаны статистические слабости, которые не были очевидны при первом
выпуске в numpy 1.17. Большинство пользователей никогда не заметят эту слабость и могут
безопасно продолжать использовать PCG64Мы представили новый PCG64DXSM
BitGenerator который в конечном итоге станет новым значением по умолчанию BitGenerator
реализация, используемая default_rng в будущих выпусках. PCG64DXSM решает статистическую слабость, сохраняя производительность и особенности
PCG64.
См. Обновление PCG64 с PCG64DXSM для получения дополнительной информации.
(gh-18906)
Устаревшие устаревания#
The
shapeаргументunravel_indexне может быть передан какdimsаргумент ключевого слова больше не используется. (Был устаревшим в NumPy 1.16.)(gh-17900)
Функция
PyUFunc_GenericFunctionбыл отключен. Он был устаревшим в NumPy 1.19. Пользователи должны вызывать ufunc напрямую, используя Python API.(gh-18697)
Функция
PyUFunc_SetUsesArraysAsDataбыл отключён. Он устарел в NumPy 1.19.(gh-18697)
Класс
PolyBaseбыл удален (устарел в numpy 1.9.0). Пожалуйста, используйте абстрактныйABCPolyBaseкласс вместо.(gh-18963)
Неиспользуемый
PolyErrorиPolyDomainErrorисключения удалены.(gh-18963)
Устаревшие функции#
The .dtype атрибут должен возвращать dtype#
A DeprecationWarning теперь выдается, если .dtype атрибут
объекта, переданного в np.dtype или как dtype=obj аргумент
не является dtype. NumPy прекратит попытки рекурсивного приведения
результата .dtype.
(gh-13578)
Неточные совпадения для numpy.convolve и numpy.correlate устарели#
convolve и correlate теперь выдают предупреждение, когда найдены совпадения без учёта регистра и/или неточные совпадения для mode аргумент в функциях.
Передавайте полный "same", "valid", "full" строки вместо
"s", "v", "f" для mode аргумент.
(gh-17492)
np.typeDict был официально объявлен устаревшим#
np.typeDict является устаревшим псевдонимом для np.sctypeDict и остается таким уже более 14 лет (6689502). Теперь будет выдаваться предупреждение об устаревании при получении np.typeDict.
(gh-17586)
Исключения будут возникать при создании массивоподобных объектов#
Когда объект вызвал исключение при доступе к специальным
атрибутам __array__ или __array_interface__, это исключение обычно игнорировалось.
Теперь выдается предупреждение, когда исключение является чем-либо, кроме AttributeError.
Чтобы отключить предупреждение, тип, вызывающий исключение, должен быть адаптирован для вызова AttributeError.
(gh-19001)
Четыре ndarray.ctypes методы были устаревшими#
Четыре метода ndarray.ctypes были устаревшими, так как они являются (недокументированными) артефактами реализации соответствующих свойств.
Рассматриваемые методы:
_ctypes.get_data(используйте_ctypes.datacount_nonzero_ctypes.get_shape(используйте_ctypes.shapecount_nonzero_ctypes.get_strides(используйте_ctypes.stridescount_nonzero_ctypes.get_as_parameter(используйте_ctypes._as_parameter_count_nonzero
(gh-19031)
Устаревшие устаревания#
The
shapeаргументnumpy.unravel_indexне может быть передан какdimsаргумент ключевого слова больше не используется. (Был устаревшим в NumPy 1.16.)(gh-17900)
Функция
PyUFunc_GenericFunctionбыл отключен. Он был устаревшим в NumPy 1.19. Пользователи должны вызывать ufunc напрямую, используя Python API.(gh-18697)
Функция
PyUFunc_SetUsesArraysAsDataбыл отключён. Он устарел в NumPy 1.19.(gh-18697)
Удалить устаревшее PolyBase и неиспользуемые PolyError и PolyDomainError#
Класс PolyBase был удален (устарел в numpy 1.9.0). Пожалуйста, используйте
абстрактный ABCPolyBase класс вместо.
Кроме того, неиспользуемый PolyError и PolyDomainError исключения
удалены из numpy.polynomial.
(gh-18963)
Примечания по совместимости#
Изменения типов ошибок в универсальных функциях#
Универсальные функции теперь могут вызывать разные ошибки при недопустимом вводе в некоторых случаях. Основные изменения должны заключаться в том, что RuntimeError был заменён на более подходящий TypeError. Когда в одном вызове присутствовало несколько
ошибок, NumPy теперь может вызывать другую.
(gh-15271)
__array_ufunc__ проверка аргументов#
NumPy теперь будет частично проверять аргументы перед вызовом __array_ufunc__. Ранее можно было передавать недопустимые аргументы (например, несуществующий ключевой аргумент), когда было известно, что произойдет диспетчеризация.
(gh-15271)
__array_ufunc__ и дополнительные позиционные аргументы#
Ранее все позиционно передаваемые аргументы проверялись на
__array_ufunc__ поддержка. В случае reduce, accumulate, и
reduceat все аргументы могут передаваться по позиции. Это означает, что когда они передавались по позиции, они ранее могли быть запрошены для обработки вызова ufunc через __array_ufunc__. Поскольку это зависело от способа передачи
аргументов (по позиции или по ключевому слову), NumPy теперь будет диспетчеризировать
только на входном и выходном массиве. Например, NumPy никогда не будет диспетчеризировать на
where массив в редукции, такой как np.add.reduce.
(gh-15271)
Проверить входные значения в Generator.uniform#
Проверено, что high - low >= 0 в np.random.Generator.uniform. Вызывает исключение
ValueError if low > high. Ранее входные данные в неправильном порядке принимались
и молча менялись местами, так что если low > high, сгенерированное значение было
high + (low - high) * random().
(gh-17921)
/usr/include удалены из путей включения по умолчанию#
Пути включения по умолчанию при сборке пакета с numpy.distutils больше
не включают /usr/include. Этот путь обычно добавляется компилятором, и жесткое кодирование может быть проблематичным. Если это вызывает проблему, пожалуйста, откройте issue. Обходное решение задокументировано в PR 18658.
(gh-18658)
Изменения в сравнениях с dtype=...#
Когда dtype= (или signature) аргументы для ufunc сравнения (equal, less, и т.д.) используется, это будет обозначать
желаемый выходной dtype в будущем.
Это означает, что:
np.equal(2, 3, dtype=object)
даст FutureWarning что он вернёт object
массив в будущем, что в настоящее время происходит для:
np.equal(None, None, dtype=object)
из-за того, что np.array(None) уже является массивом
object. (Это также происходит для некоторых других dtypes.)
Поскольку сравнения обычно возвращают только булевы массивы, предоставление любого другого типа данных всегда будет вызывать ошибку в будущем и давать DeprecationWarning сейчас.
(gh-18718)
Изменения в dtype и signature аргументы в универсальных функциях#
Аргументы универсальной функции dtype и signature
которые также действительны для редукции, такой как np.add.reduce
(что является реализацией для np.sum) теперь будет выдавать
предупреждение, когда dtype предоставленный тип данных не является «базовым».
NumPy почти всегда игнорировал метаданные, порядок байтов или единицы времени на этих входах. Теперь NumPy всегда будет игнорировать их и вызывать ошибку, если порядок байтов или единица времени изменились. Ниже приведены наиболее важные примеры изменений, которые вызовут ошибку. В некоторых случаях ранее сохранённая информация не игнорировалась, во всех этих случаях теперь вызывается ошибка:
# Previously ignored the byte-order (affect if non-native)
np.add(3, 5, dtype=">i32")
# The biggest impact is for timedelta or datetimes:
arr = np.arange(10, dtype="m8[s]")
# The examples always ignored the time unit "ns":
np.add(arr, arr, dtype="m8[ns]")
np.maximum.reduce(arr, dtype="m8[ns]")
# The following previously did use "ns" (as opposed to `arr.dtype`)
np.add(3, 5, dtype="m8[ns]") # Now return generic time units
np.maximum(arr, arr, dtype="m8[ns]") # Now returns "s" (from `arr`)
То же самое относится к функциям, таким как np.sum которые используют их внутренне.
Это изменение необходимо для достижения согласованной обработки в NumPy.
Если вы столкнулись с этим, в большинстве случаев передайте, например dtype=np.timedelta64
что явно обозначает общий timedelta64 без указания единиц измерения или порядка байтов. Если вам нужно точно указать выходной тип данных, вы можете сделать это, либо приведя входные данные, либо предоставив выходной массив с помощью out=.
NumPy может разрешить предоставление точного вывода dtype здесь в будущем, что будет предварено FutureWarning.
(gh-18718)
Ufunc signature=... и dtype= обобщение и casting#
Поведение для np.ufunc(1.0, 1.0, signature=...) или
np.ufunc(1.0, 1.0, dtype=...) теперь может давать разные циклы в 1.21
по сравнению с 1.20 из-за изменений в приведении.
Когда signature ранее использовался, проверка приведения входных данных
была ослаблена, что могло привести к небезопасному понижению типа входных данных, особенно
если сочетать с casting="unsafe".
Приведение типов теперь гарантированно безопасно. Если сигнатура предоставлена только частично, например, с использованием signature=("float64", None, None),
это может привести к тому, что цикл не будет найден (ошибка).
В этом случае необходимо предоставить полную сигнатуру,
чтобы принудительно выполнить приведение входных данных.
Если dtype="float64" используется или установлены только выходы (например,
signature=(None, None, "float64") остается неизменным.
Мы ожидаем, что очень немногие пользователи затронуты этим изменением.
Кроме того, значение dtype="float64" был немного изменен и теперь строго обеспечивает только правильные выходные (а не входные) DTypes. Это означает, что теперь он всегда эквивалентен:
signature=(None, None, "float64")
(Если ufunc имеет два входа и один выход). Поскольку это может привести к тому, что в некоторых случаях цикл не будет найден, NumPy обычно также ищет цикл:
signature=("float64", "float64", "float64")
если первый поиск не удался.
В будущем это поведение может быть настроено для достижения ожидаемых результатов для более сложных универсальных функций. (Для некоторых универсальных функций, таких как
np.ldexp входные данные могут иметь разные DTypes.)
(gh-18880)
Distutils принудительно устанавливает строгую модель с плавающей точкой на clang#
NumPy distutils теперь всегда будет добавлять -ffp-exception-behavior=strict
флаг компилятора при компиляции с clang. Clang по умолчанию использует нестрогую версию, которая позволяет компилятору генерировать код, не устанавливающий предупреждения/ошибки с плавающей точкой корректно.
(gh-19049)
Изменения в C API#
Использование ufunc->type_resolver и "кортеж типа"#
NumPy теперь нормализует аргумент "кортеж типа" для функций разрешения типов перед вызовом. Обратите внимание, что использование этого разрешителя типов является устаревшим поведением, и NumPy не будет делать этого, когда это возможно. Вызов
ufunc->type_resolver или PyUFunc_DefaultTypeResolver строго
не рекомендуется и теперь будет принудительно применять нормализованный кортеж типов, если это сделано. Обратите внимание, что
это не влияет на предоставление разрешителя типов, который, как ожидается, продолжит
работать в большинстве случаев. Если у вас есть неожиданный случай использования вызова
разрешителя типов, пожалуйста, сообщите разработчикам NumPy, чтобы можно было
найти решение.
(gh-18718)
Новые возможности#
Добавлен плагин mypy для обработки специфичных для платформы numpy.number точности#
A mypy плагин теперь доступен для автоматического назначения (зависимых от платформы)
точностей определенных number подклассы, включая такие как
int_, intp и longlong. См. документацию по
скалярные типы для полного обзора затронутых классов.
Обратите внимание, что хотя использование плагина полностью необязательно, без него точность вышеупомянутых классов будет выведена как Any.
Чтобы включить плагин, необходимо добавить его в свой mypy файл конфигурации:
[mypy]
plugins = numpy.typing.mypy_plugin
(gh-17843)
Пусть плагин mypy управляет расширенной точностью numpy.number подклассы#
The mypy плагин, представленный в numpy/numpy#17843, был расширен:
теперь плагин удаляет аннотации для платформенно-специфичных
типов расширенной точности, которые недоступны на данной платформе.
Например, он удалит float128 когда недоступно.
Без плагина все типы расширенной точности будут, насколько это касается mypy, доступны на всех платформах.
Чтобы включить плагин, необходимо добавить его в свой mypy файл конфигурации:
[mypy]
plugins = numpy.typing.mypy_plugin
(gh-18322)
Новый min_digits аргумент для печати значений с плавающей точкой#
Новый min_digits аргумент был добавлен в функции печати чисел с плавающей точкой dragon4 format_float_positional и format_float_scientific
. Этот аргумент гарантирует, что при печати в режиме unique=True будет выведено как минимум указанное количество цифр,
даже если дополнительные цифры не нужны для
однозначного определения значения. Это аналог аргумента precision,
который устанавливает максимальное количество выводимых цифр. Когда unique=False в
режиме фиксированной точности, он не имеет эффекта, и аргумент precision фиксирует
количество цифр.
(gh-18629)
f2py теперь распознаёт блоки абстрактного интерфейса Fortran#
f2py теперь может анализировать блоки абстрактных интерфейсов.
(gh-18695)
Конфигурация BLAS и LAPACK через переменные окружения#
Автоопределение установленных библиотек BLAS и LAPACK можно обойти, используя NPY_BLAS_LIBS и NPY_LAPACK_LIBS переменные окружения. Вместо этого флаги компоновки в этих переменных окружения будут использоваться напрямую, и язык предполагается F77. Это особенно полезно в автоматизированных сборках, где установленные BLAS и LAPACK точно известны. Пример использования — замена фактической реализации во время выполнения через ссылки на заглушки библиотек.
Если NPY_CBLAS_LIBS установлен (дополнительно к NPY_BLAS_LIBS), это
также будет использовано, путем определения HAVE_CBLAS и добавления содержимого переменной окружения к флагам компоновки.
(gh-18737)
Добавлен псевдоним с возможностью подписки во время выполнения для ndarray#
numpy.typing.NDArray был добавлен, псевдоним для подписки во время выполнения для
np.ndarray[Any, np.dtype[~Scalar]]. Новый псевдоним типа можно использовать
для аннотирования массивов с заданным dtype и неопределённой формой. 1
1 NumPy не поддерживает аннотирование форм массивов начиная с версии 1.21, ожидается, что это изменится в будущем (см. PEP 646).
Примеры#
>>> import numpy as np
>>> import numpy.typing as npt
>>> print(npt.NDArray)
numpy.ndarray[typing.Any, numpy.dtype[~ScalarType]]
>>> print(npt.NDArray[np.float64])
numpy.ndarray[typing.Any, numpy.dtype[numpy.float64]]
>>> NDArrayInt = npt.NDArray[np.int_]
>>> a: NDArrayInt = np.arange(10)
>>> def func(a: npt.ArrayLike) -> npt.NDArray[Any]:
... return np.array(a)
(gh-18935)
Улучшения#
Произвольный period опция для numpy.unwrap#
Размер интервала, по которому разворачиваются фазы, больше не ограничен 2 * pi. Это особенно полезно для развёртывания градусов, но также может использоваться для других интервалов.
>>> phase_deg = np.mod(np.linspace(0,720,19), 360) - 180
>>> phase_deg
array([-180., -140., -100., -60., -20., 20., 60., 100., 140.,
-180., -140., -100., -60., -20., 20., 60., 100., 140.,
-180.])
>>> unwrap(phase_deg, period=360)
array([-180., -140., -100., -60., -20., 20., 60., 100., 140.,
180., 220., 260., 300., 340., 380., 420., 460., 500.,
540.])
(gh-16987)
np.unique теперь возвращает одиночный NaN#
Когда np.unique работал с массивом, содержащим несколько NaN записи,
его возврат включал NaN для каждой записи, которая была NaN в исходном массиве.
Теперь это улучшено так, что возвращаемый массив содержит только один NaN как последний элемент.
Также для комплексных массивов все NaN значения считаются эквивалентными
(независимо от того, NaN находится в действительной или мнимой части). В качестве представителя для возвращаемого массива выбирается наименьший в лексикографическом порядке - см. np.sort для определения того, как лексикографический
порядок определен для комплексных массивов.
(gh-18070)
Generator.rayleigh и Generator.geometric производительность улучшена#
Производительность генерации случайных величин Рэлея и геометрических
в Generator улучшился. Это и преобразование экспоненциальных случайных величин, и медленное логарифмическое обратное преобразование cdf было заменено генератором экспоненциальных вариатов на основе Ziggurat.
Это изменение нарушает поток генерируемых вариантов, когда производятся варианты из любого из этих распределений.
(gh-18666)
Улучшены аннотации-заглушки#
Все аннотации-заглушки, которые ранее были аннотированы как typing.Anyбыли улучшены. Там, где это уместно, они были заменены явными определениями функций, классами или другими объектами.
(gh-18934)
Улучшения производительности#
Улучшенная производительность целочисленного деления массивов NumPy#
Целочисленное деление массивов NumPy теперь использует
libdivide когда делитель является константой. С использованием libdivide и других незначительных оптимизаций достигается значительное ускорение. // оператор и np.floor_divide использует новые изменения.
(gh-17727)
Улучшена производительность np.save и np.load для небольших массивов#
np.save теперь значительно быстрее для небольших массивов.
np.load также быстрее для небольших массивов, но только при сериализации с версией >= (3, 0).
Оба действия выполняются путем удаления проверок, которые актуальны только для Python 2, при этом сохраняя совместимость с массивами, которые могли быть созданы в Python 2.
(gh-18657)
Изменения#
numpy.piecewise выходной класс теперь соответствует входному классу#
Когда ndarray подклассы используются на входе для piecewise,
они передаются функциям. Выходные данные теперь также будут
того же подкласса.
(gh-18110)
Включить Accelerate Framework#
С выпуском macOS 11.3 несколько различных проблем, с которыми сталкивался numpy при использовании реализации BLAS и LAPACK в Accelerate Framework, должны быть решены. Это изменение включает Accelerate Framework в качестве опции на macOS. Если будут обнаружены дополнительные проблемы, пожалуйста, сообщите об ошибке в Accelerate с помощью инструмента обратной связи разработчика (https://developer.apple.com/bug-reporting/). Мы намерены оперативно решать проблемы и планируем продолжать поддерживать и обновлять наши библиотеки BLAS и LAPACK.
(gh-18874)