Примечания к выпуску 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_error to npy_set_floatstatus_divbyzero и generate_overflow_error to npy_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 и searchside raise (устарело с версии 1.20)

    (gh-28254)

  • Установка __array_finalize__ = None errors (устарело с версии 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) to float32 (переполнение до бесконечности) или 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.12 to 2024.12.

  • numpy.count_nonzero для axis=None (по умолчанию) теперь возвращает скаляр NumPy вместо целого числа Python.

  • Параметр axis в numpy.take_along_axis функция теперь имеет значение по умолчанию -1.

    (gh-28615)

  • Печать np.float16 и np.float32 скаляры и массивы были улучшены путем настройки перехода к научной нотации на основе точности с плавающей запятой. Новое наследие np.printoptions mode '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)