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

Выпуск NumPy 2.2.0 — это быстрый выпуск, который возвращает нас к обычному циклу выпуска два раза в год. Было выполнено несколько небольших улучшений, а также работа по завершению нового StringDType и улучшению поддержки свободнопоточного Python. Основные моменты:

  • Новые функции matvec и vecmat, см. ниже.

  • Много улучшенных аннотаций.

  • Улучшенная поддержка нового StringDType.

  • Улучшена поддержка свободнопоточного Python

  • Исправления для f2py

Этот выпуск поддерживает версии Python 3.10-3.13.

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

  • _add_newdoc_ufunc теперь устарело. ufunc.__doc__ = newdoc следует использовать вместо этого.

    (gh-27735)

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

  • bool(np.array([])) и другие пустые массивы теперь будут вызывать ошибку. Используйте arr.size > 0 вместо проверки, имеет ли массив элементы.

    (gh-27160)

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

  • numpy.cov теперь правильно транспонирует однострочные (2D массивы) матрицы дизайна, когда rowvar=False. Ранее матрицы проектирования с одной строкой возвращали скаляр в этом сценарии, что неверно, поэтому это изменение поведения, и теперь будет возвращаться массив соответствующей формы.

    (gh-27661)

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

  • Новые функции для матрично-векторных и векторно-матричных произведений

    Были определены два новых обобщенных ufunc:

    • numpy.matvec - произведение матрицы на вектор, рассматривая аргументы как стеки матриц и столбцов векторов соответственно.

    • numpy.vecmat - векторно-матричное произведение, рассматривая аргументы как столбцы векторов и матриц соответственно. Для комплексных векторов берется сопряженное значение.

    Они добавляются к существующим numpy.matmul а также для numpy.vecdot, который был добавлен в numpy 2.0.

    Обратите внимание, что numpy.matmul никогда не берёт комплексное сопряжение, также не когда его левый вход — вектор, в то время как оба numpy.vecdot и numpy.vecmat берут сопряжение для комплексных векторов на левой стороне (которые считаются транспонированными, согласно физическому соглашению).

    (gh-25675)

  • np.complexfloating[T, T] теперь также может быть записано как np.complexfloating[T]

    (gh-27420)

  • UFuncs теперь поддерживают __dict__ атрибут и разрешить переопределение __doc__ (либо напрямую, либо через ufunc.__dict__["__doc__"]). __dict__ можно использовать для переопределения других свойств, таких как __module__ или __qualname__.

    (gh-27735)

  • Параметр типа "nbit" np.number и его подтипы теперь по умолчанию typing.AnyТаким образом, средства проверки типов будут выводить аннотации, такие как x: np.floating как x: np.floating[Any], даже в строгом режиме.

    (gh-27736)

Улучшения#

  • The datetime64 и timedelta64 хэши теперь правильно соответствуют встроенным в Python datetime и timedelta Хэши теперь оцениваются как равные даже для равных значений с разными единицами времени.

    (gh-14622)

  • Исправлен ряд проблем с приведением типов для строковых ufunc с аргументами StringDType. Смешивание StringDType и фиксированных DTypes с использованием строковых ufunc теперь должно давать гораздо более однородные результаты.

    (gh-27636)

  • Улучшенная поддержка пустых memmap. Ранее пустой memmap не сработает, если не указано ненулевое offset был установлен. Теперь массив нулевого размера memmap поддерживается даже если offset=0. Чтобы достичь этого, если memmap отображается в пустой файл, этот файл дополняется одним байтом.

    (gh-27723)

f2py обрабатывает несколько модулей и снова экспонирует переменные#

Исправлена регрессия, позволяющая пользователям F2PY предоставлять переменные Python в модулях только с присваиваниями, а также исправлены ситуации, когда в одном исходном файле присутствуют несколько модулей.

(gh-27695)

Улучшения и изменения производительности#

  • Улучшено масштабирование многопоточности в сборке с свободными потоками, когда многие потоки одновременно вызывают одни и те же операции ufunc.

    (gh-27896)

  • NumPy теперь использует быстрые при неудаче поиски атрибутов для протоколов. Это может значительно снизить накладные расходы вызовов функций или создания массивов, особенно с пользовательскими объектами Python. Наибольшие улучшения будут видны на Python 3.12 или новее.

    (gh-27119)

  • OpenBLAS на x86_64 и i686 собран с меньшим количеством ядер. На основе тестирования выделено 5 кластеров производительности вокруг этих ядер: PRESCOTT NEHALEM SANDYBRIDGE HASWELL SKYLAKEX.

  • OpenBLAS в Windows линкуется без quadmath, упрощая лицензирование

  • Из-за регрессии в OpenBLAS на Windows, улучшения производительности при использовании нескольких потоков для OpenBLAS 0.3.26 были отменены.

    (gh-27147)

  • NumPy теперь указывает hugepages также для больших np.zeros выделениями памяти в Linux. Таким образом, это должно в целом улучшить производительность.

    (gh-27808)

Изменения#

  • numpy.fix теперь не будет выполнять приведение к типу данных с плавающей точкой для входных массивов целочисленного и булевого типа данных.

    (gh-26766)

  • Аннотации типов numpy.float64 и numpy.complex128 теперь отражают, что они также являются подтипами встроенного float и complex типы, соответственно. Это обновление предотвращает сообщения об ошибках статическими анализаторами типов в случаях, таких как:

    x: float = numpy.float64(6.28)  # valid
    z: complex = numpy.complex128(-1j)  # valid
    

    (gh-27334)

  • The repr массивов, достаточно больших для суммирования (т.е., где элементы заменяются на ...) теперь включает shape массива, аналогично тому, что уже было для массивов с нулевым размером и неочевидной формой. С этим изменением форма всегда указывается, когда ее нельзя вывести из значений. Обратите внимание, что хотя записано как shape=..., этот аргумент фактически не может быть передан в np.array конструктор. Если вы столкнётесь с проблемами, например, из-за неудачных тестов документации, вы можете использовать опцию печати legacy=2.1 чтобы получить старое поведение.

    (gh-27482)

  • Вызов __array_wrap__ непосредственно на массивах NumPy или скалярах теперь работает правильно, когда return_scalar передаётся (добавлено в NumPy 2). Теперь также безопасно вызывать скаляр __array_wrap__ на нескалярном результате.

    (gh-27807)

Обновление CI-образа musllinux и колес до 1_2 с 1_1. Это связано с тем, что 1_1 конец жизненного цикла.

(gh-27088)

Опция состояния продвижения NEP 50 удалена#

Настройки состояния продвижения NEP 50 теперь удалены. Они всегда предназначались как временное средство для тестирования. Будет выдано предупреждение, если переменная окружения установлена на что-либо, кроме NPY_PROMOTION_STATE=weak в то время как _set_promotion_state и _get_promotion_state удаляются. В случае если код использовал _no_nep50_warning, a contextlib.nullcontext может использоваться для его замены, когда он недоступен.

(gh-27156)