Примечания к выпуску NumPy 2.3.0#
Выпуск NumPy 2.3.0 продолжает работу по улучшению поддержки свободно-поточного Python и аннотаций вместе с обычным набором исправлений ошибок. Он необычен по количеству устаревших устареваний, модернизаций кода и очистки стиля. Последнее может быть невидимо для пользователей, но важно для поддержки кода в долгосрочной перспективе. Обратите внимание, что мы также обновили с manylinux2014 до manylinux_2_28.
Пользователи, работающие на Mac с процессором M4, могут видеть различные предупреждения о недопустимых значениях и тому подобном. Эти предупреждения являются известной проблемой с Accelerate. Они раздражают, но в остальном безвредны. Apple обещает их исправить.
Данный релиз поддерживает версии Python 3.11-3.13, Python 3.14 будет поддерживаться после его выпуска.
Основные моменты#
Интерактивные примеры в документации NumPy.
Сборка NumPy с параллелизацией OpenMP.
Предварительная поддержка Windows на ARM.
Улучшенная поддержка свободно-поточного Python.
Улучшенные аннотации.
Новые функции#
Новая функция numpy.strings.slice#
Новая функция numpy.strings.slice был добавлен, который реализует быстрое нативное срезание строковых массивов. Он поддерживает полный API среза, включая отрицательные смещения и шаги.
(gh-27789)
Устаревшие функции#
The
numpy.typing.mypy_pluginбыл устаревшим в пользу платформо-независимого статического вывода типов. Пожалуйста, удалитеnumpy.typing.mypy_pluginизpluginsразделе вашей конфигурации mypy. Если это изменение приводит к появлению новых ошибок, пожалуйста, откройте issue.(gh-28129)
The
numpy.typing.NBitBaseтип устарел и будет удалён в будущей версии.Этот тип ранее предполагалось использовать как общую верхнюю границу для параметров типа, например:
import numpy as np import numpy.typing as npt def f[NT: npt.NBitBase](x: np.complexfloating[NT]) -> np.floating[NT]: ...
Но в NumPy 2.2.0,
float64иcomplex128были изменены на конкретные подтипы, что привело к отказу статических анализаторов типовx: np.float64 = f(np.complex128(42j)).Поэтому вместо этого лучший подход — использовать
typing.overload:import numpy as np from typing import overload @overload def f(x: np.complex64) -> np.float32: ... @overload def f(x: np.complex128) -> np.float64: ... @overload def f(x: np.clongdouble) -> np.longdouble: ...
(gh-28884)
Устаревшие устаревания#
Удалите устаревшие макросы, такие как
NPY_OWNDATAиз интерфейсов Cython в пользуNPY_ARRAY_OWNDATA(устарело с версии 1.7)(gh-28254)
Удалить
numpy/npy_1_7_deprecated_api.hи макросы C, такие какNPY_OWNDATAв пользуNPY_ARRAY_OWNDATA(устарело с версии 1.7)(gh-28254)
Удалить псевдоним
generate_divbyzero_errortonpy_set_floatstatus_divbyzeroиgenerate_overflow_errortonpy_set_floatstatus_overflow(устарело с версии 1.10)(gh-28254)
Удалить
np.tostring(устарело с версии 1.19)(gh-28254)
Вызвать исключение при
np.conjugateнечисловых типов (устарело с версии 1.13)(gh-28254)
Вызывается при использовании
np.bincount(...minlength=None), используйте 0 вместо этого (устарело с версии 1.14)(gh-28254)
Передача
shape=Noneдля функций с обязательным аргументом формы ошибки, используйте()вместо (устарело с версии 1.20)(gh-28254)
Неточные совпадения для
modeиsearchsideraise (устарело с версии 1.20)(gh-28254)
Установка
__array_finalize__ = Noneerrors (устарело с версии 1.23)(gh-28254)
np.fromfileиnp.fromstringошибка при плохих данных, ранее они угадывали (устарело с версии 1.18)(gh-28254)
datetime64иtimedelta64конструкция с кортежем больше не принимаетeventзначение, используйте либо двухэлементный кортеж (unit, num), либо 4-элементный кортеж (unit, num, den, 1) (устарело с версии 1.14)(gh-28254)
При построении
dtypeиз класса сdtypeатрибут, то этот атрибут должен быть экземпляром dtype, а не объектом, который может быть разобран как экземпляр dtype (устарело в 1.19). В какой-то момент вся конструкция использования атрибута dtype будет устаревшей (см. #25306)(gh-28254)
Передача булевых значений в качестве индекса разбиения вызывает ошибки (устарело с версии 1.23)
(gh-28254)
Индексы за пределами границ вызывают ошибку даже на пустых массивах (устарело с версии 1.20)
(gh-28254)
np.tostringбыл удален, используйтеtobytesвместо (устарело с версии 1.19)(gh-28254)
Запретить делать не записываемый массив записываемым для массивов с базой, которые не владеют своими данными (устарело с версии 1.17)
(gh-28254)
concatenate()сaxis=Noneиспользуетsame-kindприведение по умолчанию, а неunsafe(устарело с версии 1.20)(gh-28254)
Распаковка скаляра с типом данных object вызывает ошибки (устарело с версии 1.20)
(gh-28254)
Бинарный режим
fromstringтеперь вызывает ошибки, используйтеfrombufferвместо (устарело с версии 1.14)(gh-28254)
Преобразование
np.inexactилиnp.floatingв dtype ошибки (устарело с 1.19)(gh-28254)
Преобразование
np.complex,np.integer,np.signedinteger,np.unsignedinteger,np.genericв тип данных вызывает ошибки (устарело с 1.19)(gh-28254)
Встроенный в Python
roundошибки для комплексных скаляров. Используйтеnp.roundилиscalar.roundвместо (устарело с версии 1.19)(gh-28254)
Скаляры 'np.bool' больше не могут интерпретироваться как индекс (устарело с версии 1.19)
(gh-28254)
Разбор целого числа через строку с плавающей точкой больше не поддерживается. (устарело с версии 1.23) Чтобы избежать этой ошибки, вы можете * убедиться, что исходные данные хранятся как целые числа. * использовать
converters=floatключевой аргумент. * Используйтеnp.loadtxt(...).astype(np.int64)(gh-28254)
Использование кортежа длины 1 для ufunc
signatureошибки. Используйтеdtypeили заполнить кортежNone(устарело с версии 1.19)(gh-28254)
Специальная обработка матрицы в np.outer удалена. Преобразовать в ndarray через
matrix.A(устарело с версии 1.20)(gh-28254)
Удалён
np.compatисходный код пакета (удален в 2.0)(gh-28961)
Изменения в C API#
NpyIter_GetTransferFlagsтеперь доступен для проверки, нужно ли итератору Python API или могут ли приведения вызвать ошибки с плавающей точкой (FPE). FPE могут возникать, например, при приведенииfloat64(1e300)tofloat32(переполнение до бесконечности) или NaN в целое число (некорректное значение).(gh-27883)
NpyIterтеперь не имеет ограничений на количество поддерживаемых операндов.(gh-28080)
Новый NpyIter_GetTransferFlags и NpyIter_IterationNeedsAPI изменение#
NumPy теперь имеет новый NpyIter_GetTransferFlags функция как более точный
способ проверки потребностей итератора/буферизации. Т.е. требуется ли Python API/GIL или
могут возникать ошибки с плавающей точкой.
Эта функция также быстрее, если вы уже знаете свои потребности без буферизации.
The NpyIter_IterationNeedsAPI функция теперь выполняет все проверки, которые ранее выполнялись во время настройки. Хотя никогда не было необходимости вызывать её несколько раз, теперь это будет иметь большую стоимость.
(gh-27998)
Новые возможности#
Параметр типа
np.dtypeтеперь по умолчаниюtyping.Any. Таким образом, статические анализаторы типов будут выводитьdtype: np.dtypeкакdtype: np.dtype[Any], без сообщения об ошибке.(gh-28669)
Статические проверки типов теперь интерпретируют:
_: np.ndarrayкак_: npt.NDArray[typing.Any]._: np.flatiterкак_: np.flatiter[np.ndarray].
Это связано с тем, что их параметры типа теперь имеют значения по умолчанию.
(gh-28940)
NumPy теперь регистрирует свои пути pkg-config с pkgconf Пакет PyPI#
The pkgconf Пакет PyPI предоставляет интерфейс для проектов, таких как NumPy, чтобы зарегистрировать свои собственные пути для добавления в путь поиска pkg-config. Это означает, что при использовании pkgconf из PyPI, NumPy будет обнаруживаться без необходимости какой-либо специальной настройки окружения.
Внимание
Внимание
Это применяется только при использовании pkgconf пакет из PyPI, или, другими словами, это применяется только при установке pkgconf через менеджер пакетов Python.
Если вы используете pkg-config или pkgconf предоставляемая вашей системой, или
любой другой источник, который не использует pkgconf-pypi проекте, каталог pkg-config NumPy не будет автоматически добавлен в путь поиска. В таких ситуациях вы можете использовать numpy-config.
(gh-28214)
Разрешить out=... в ufuncs для гарантии результата в виде массива#
NumPy имеет иногда сложное поведение, при котором он обычно
возвращает скаляры, а не 0-D массивы (даже если входные данные были 0-D массивами).
Это особенно проблематично для нечисловых типов данных (например, object).
Для ufuncs (т.е. большинства простых математических функций) теперь можно использовать
out=... (буквально `…`, например, out=Ellipsis), который идентичен по
поведению out не передается, но обеспечит возврат нескалярного значения.
Это написание заимствовано из arr1d[0, ...] где ... также гарантирует
возврат нескалярного значения.
Другие функции с out= kwarg должен получить поддержку в будущем.
Сторонние библиотеки, взаимодействующие через __array_ufunc__ или
__array_function__ может потребоваться адаптироваться для поддержки этого.
(gh-28576)
Сборка NumPy с параллелизацией OpenMP#
NumPy теперь поддерживает возможности параллельной обработки OpenMP при сборке с
-Denable_openmp=true Флаг сборки Meson. Эта функция отключена по умолчанию. При включении, np.sort и np.argsort функции могут использовать OpenMP для
параллельного выполнения потоков, улучшая производительность этих операций.
(gh-28619)
Интерактивные примеры в документации NumPy#
Документация NumPy включает ряд примеров, которые теперь можно запускать интерактивно в вашем браузере с использованием WebAssembly и Pyodide.
Обратите внимание, что примеры в настоящее время являются экспериментальными и могут работать не так, как ожидается, для всех методов в публичном API.
(gh-26745)
Улучшения#
Скалярные сравнения между несравнимыми типами данных, такими как
np.array(1) == np.array('s')теперь возвращают NumPy bool вместо Python bool.(gh-27288)
np.nditerтеперь не имеет ограничения на количество поддерживаемых операндов (C-целое число).(gh-28080)
Теперь поддерживается pickling без копирования для любого массива, который можно транспонировать в C-непрерывный массив.
(gh-28105)
The
__repr__для пользовательских типов данных теперь предпочитает__name__пользовательского типа данных по сравнению с более общим именем, сформированным из егоkindиitemsize.(gh-28250)
np.dotтеперь сообщает об исключениях с плавающей точкой.(gh-28442)
np.dtypes.StringDTypeтеперь является обобщённым типом который принимает аргумент типа дляna_objectкоторый по умолчанию равенtyping.Never. Например,StringDType(na_object=None)возвращаетStringDType[None], иStringDType()возвращаетStringDType[typing.Never].(gh-28856)
Добавлены предупреждения к np.isclose#
Добавлены предупреждающие сообщения, если хотя бы один из atol или rtol является либо np.nan или
np.inf внутри np.isclose.
Предупреждения следуют
np.seterrнастройки
(gh-28205)
Улучшения и изменения производительности#
Улучшения производительности для np.unique#
np.unique теперь пытается использовать хеш-таблицу для поиска уникальных значений вместо
сортировки значений перед поиском уникальных значений. Это пока ограничено определенными типами данных,
и функция теперь быстрее для этих типов данных. Функция теперь также
предоставляет sorted позволяет возвращать уникальные значения по мере их
нахождения, вместо сортировки после.
(gh-26018)
Улучшения производительности для np.sort и np.argsort#
np.sort и np.argsort функции теперь могут использовать OpenMP для параллельного
выполнения потоков, что дает ускорение до 3.5 раз на архитектурах x86 с
инструкциями AVX2 или AVX-512. Эта опция требует сборки NumPy
с флагом Meson -Denable_openmp. Пользователи могут контролировать количество потоков,
устанавливая переменную окружения OMP_NUM_THREADS.
(gh-28619)
Улучшения производительности для np.float16 преобразует#
Ранее приведение к плавающей точке и из неё np.float16 типы эмулировались программно на всех платформах.
Теперь на устройствах ARM, поддерживающих Neon float16 intrinsics (например, на недавних Apple Silicon), используется собственный путь float16 для достижения наилучшей производительности.
(gh-28769)
Улучшения производительности для np.matmul#
Включить использование BLAS для matmul даже когда операнды не являются непрерывными, путем копирования
при необходимости.
(gh-23752)
Изменения#
Векторная норма
ord=infи матричные нормыord={1, 2, inf, 'nuc'}теперь всегда возвращает ноль для пустых массивов. Пустые массивы имеют хотя бы одну ось размера ноль. Это влияет наnp.linalg.norm,np.linalg.vector_norm, иnp.linalg.matrix_norm. Ранее NumPy выдавал ошибки или возвращал ноль в зависимости от формы массива.(gh-28343)
Орфографическая ошибка в сообщении об ошибке, возвращаемом при преобразовании строки в число с плавающей точкой методом
np.format_float_positionalбыл исправлен.(gh-28569)
NumPy
__array_api_version__был обновлён с2023.12to2024.12.numpy.count_nonzeroдляaxis=None(по умолчанию) теперь возвращает скаляр NumPy вместо целого числа Python.Параметр
axisвnumpy.take_along_axisфункция теперь имеет значение по умолчанию-1.(gh-28615)
Печать
np.float16иnp.float32скаляры и массивы были улучшены путем настройки перехода к научной нотации на основе точности с плавающей запятой. Новое наследиеnp.printoptionsmode'2.2'был добавлен для обратной совместимости.(gh-28703)
Умножение между строкой и целым числом теперь вызывает OverflowError вместо MemoryError, если результат умножения создаст строку, слишком большую для представления. Это соответствует поведению Python.
(gh-29060)
unique_values может возвращать несортированные данные#
Относительно новая функция (добавлена в NumPy 2.0) unique_values теперь может
возвращать несортированные результаты. Так же, как unique_counts и unique_all эти
никогда не гарантировали отсортированный результат, однако до сих пор результат был отсортирован. В
случаях, когда они возвращают отсортированный результат, это может измениться в будущих выпусках
для повышения производительности.
(gh-26018)
Изменения в основном итераторе и потенциальные числовые изменения#
Основной итератор, используемый в математических функциях и через np.nditer из Python и
NpyIter в C теперь ведет себя иначе для некоторых буферизованных итераций. Это означает, что:
Используемый размер буфера часто будет меньше максимального размера буфера, разрешенного
buffersizeпараметр.Флаг "growinner" теперь учитывается при буферизованных редукциях, когда ни один операнд не требует буферизации.
Для np.sum() такие изменения размера буфера могут немного изменить численные
результаты операций с плавающей точкой. Пользователи, которые используют "growinner" для пользовательских
редукций, могут заметить изменения в точности (например, в NumPy мы удалили
его из einsum чтобы избежать большинства изменений точности и улучшить точность для
некоторых 64-битных входных данных с плавающей запятой).
(gh-27883)
Минимальная поддерживаемая версия GCC теперь 9.3.0#
Минимальная поддерживаемая версия была обновлена с 8.4.0 до 9.3.0, в основном чтобы снизить вероятность возникновения проблем из-за платформенно-зависимых ошибок в старых версиях GCC.
(gh-28102)
Изменения в автоматическом выборе бинов в numpy.histogram#
Алгоритм автоматического выбора бинов в numpy.histogram был изменён, чтобы избежать ошибок нехватки памяти для выборок с низкой вариацией. Для полного контроля над выбранными интервалами пользователь может установить bin или range параметры
numpy.histogram.
(gh-28426)
Сборка колес manylinux_2_28#
Сборки для Linux-систем будут использовать manylinux_2_28 тег (вместо
manylinux2014 тег), что означает отказ от поддержки redhat7/centos7,
amazonlinux2, debian9, ubuntu18.04 и других версий операционных систем
до glibc2.28, в соответствии с Таблица поддержки PEP 600.
(gh-28436)
Убрать использование -Wl,-ld_classic в macOS#
Убрать использование -Wl,-ld_classic в macOS. Этот хак больше не нужен Spack и приводит к библиотекам, которые не могут линковаться с другими библиотеками, собранными с ld (новым).
(gh-28713)
Повторное включение переопределения функций в numpy.strings#
Повторное включение переопределения функций в numpy.strings модуль.
(gh-28741)