Примечания к выпуску NumPy 1.23.0#
Выпуск NumPy 1.23.0 продолжает текущую работу по улучшению обработки и продвижения типов данных (dtypes), увеличению скорости выполнения, уточнению документации и устареванию старых устаревших функций. Основные моменты:
Реализация
loadtxtв C, значительно улучшая его производительность.Предоставление DLPack на уровне Python для легкого обмена данными.
Изменения в продвижении и сравнениях структурированных типов данных.
Улучшения в f2py.
Подробности см. ниже,
Новые функции#
Специализация маскированного массива для
ndenumerateтеперь доступен какnumpy.ma.ndenumerate. Он предоставляет альтернативуnumpy.ndenumerateи пропускает замаскированные значения по умолчанию.(gh-20020)
numpy.from_dlpackбыл добавлен для удобного обмена данными с использованием протокола DLPack. Он принимает объекты Python, которые реализуют__dlpack__и__dlpack_device__методы и возвращает объект ndarray, который обычно является представлением данных входного объекта.(gh-21145)
Устаревшие функции#
Установка
__array_finalize__toNoneустарел. Теперь он должен быть методом и может захотеть вызватьsuper().__array_finalize__(obj)после проверки наNoneили если версия NumPy достаточно новая.(gh-20766)
Используя
axis=32(axis=np.MAXDIMS) во многих случаях имели то же значение, что иaxis=None. Это устарело иaxis=Noneдолжен использоваться вместо.(gh-20920)
Функция-перехватчик
PyDataMem_SetEventHookбыл устаревшим и демонстрация его использования в tool/allocation_tracking была удалена. Возможность отслеживания выделений теперь встроена в Python черезtracemalloc.(gh-20394)
numpy.distutilsбыл объявлен устаревшим в результатеdistutilsсам устаревает. Он не будет присутствовать в NumPy для Python >= 3.12 и будет полностью удалён через 2 года после выпуска Python 3.12. Подробнее см. Статус numpy.distutils и рекомендации по миграции.(gh-20875)
numpy.loadtxtтеперь выдастDeprecationWarningкогда целое числоdtypeзапрашивается, но значение форматируется как число с плавающей точкой.(gh-21663)
Устаревшие устаревания#
The
NpzFile.iteritems()иNpzFile.iterkeys()методы были удалены как часть продолжающегося удаления совместимости с Python 2. Это завершает устаревание с 1.15.(gh-16830)
The
alenиasscalarфункции были удалены.(gh-20414)
The
UPDATEIFCOPYфлаг массива был удален вместе с перечислениемNPY_ARRAY_UPDATEIFCOPY. Связанный (и устаревший)PyArray_XDECREF_ERRтакже был удален. Все они были устаревшими в версии 1.14. Они заменены наNPY_ARRAY_WRITEBACKIFCOPY, что требует вызоваPyArray_ResolveWritebackIfCopyдо того, как массив будет освобождён.(gh-20589)
Исключения будут возникать при создании объектов, подобных массивам. Когда объект вызывал исключение при доступе к специальным атрибутам
__array__или__array_interface__, это исключение обычно игнорировалось. Такое поведение устарело в версии 1.21, и теперь исключение будет вызываться.(gh-20835)
Многомерная индексация с нетупловыми значениями не разрешена. Ранее код, такой как
arr[ind]гдеind = [[0, 1], [0, 1]]произвелFutureWarningи интерпретировался как многомерный индекс (т.е.,arr[tuple(ind)]). Теперь этот пример обрабатывается как индекс массива по одному измерению (arr[array(ind)]). Многомерная индексация с чем-либо, кроме кортежа, была объявлена устаревшей в NumPy 1.15.(gh-21029)
Изменение на dtype другого размера в F-непрерывных массивах больше не разрешено. Устарело с Numpy 1.11.0. Смотрите ниже расширенное объяснение эффектов этого изменения.
(gh-20722)
Новые возможности#
crackfortran поддерживает перегрузку операторов и присваивания#
crackfortran парсер теперь понимает определения операторов и присваиваний
в модуле. Они добавлены в body список модуля, который содержит новый ключ implementedby перечисляя имена
подпрограмм или функций, реализующих оператор или
присваивание.
(gh-15006)
f2py поддерживает чтение атрибутов типа доступа из операторов производных типов#
В результате не нужно использовать public или private операторы для указания свойств доступа к производным типам.
(gh-15844)
Новый параметр ndmin добавлен в genfromtxt#
Этот параметр ведет себя так же, как ndmin из numpy.loadtxt.
(gh-20500)
np.loadtxt теперь поддерживает символ кавычки и единую функцию преобразования#
numpy.loadtxt теперь поддерживает дополнительный quotechar именованный аргумент, который не установлен по умолчанию. Использование quotechar='"' будет читать поля в кавычках,
как в диалекте CSV Excel.
Кроме того, теперь можно передавать один вызываемый объект вместо словаря для converters аргумент.
(gh-20580)
Изменение типа данных на другой размер теперь требует непрерывности только последней оси.#
Ранее просмотр массива с dtype другого размера элемента требовал, чтобы весь массив был C-непрерывным. Это ограничение вынуждало пользователя создавать непрерывные копии не непрерывных массивов перед возможностью изменения dtype.
Это изменение затрагивает не только ndarray.view, но другие механизмы
конструкции, включая нерекомендуемое прямое присваивание ndarray.dtype.
Это изменение отменяет устаревание, касающееся просмотра F-последовательных массивов, описанное в других местах примечаний к выпуску.
(gh-20722)
Детерминированные выходные файлы для F2PY#
Для входных данных F77, f2py сгенерирует modname-f2pywrappers.f
безусловно, хотя они могут быть пустыми. Для свободного ввода,
modname-f2pywrappers.f, modname-f2pywrappers2.f90 будут генерироваться безусловно и могут быть пустыми. Это позволяет писать общие правила вывода в
cmake или meson и другие системы сборки. Старое поведение можно восстановить,
передав --skip-empty-wrappers to f2py. Использование через meson подробности использования.
(gh-21187)
keepdims параметр для average#
Параметр keepdims был добавлен к функциям numpy.average
и numpy.ma.average#27146 numpy.sum или numpy.mean.
(gh-21485)
Новый параметр equal_nan добавлен в np.unique#
np.unique был изменен в 1.21 для обработки всех NaN значения как равные и возвращает один NaN. Установка equal_nan=False восстановит поведение до версии 1.21 для обработки NaNs как уникальные. По умолчанию True.
(gh-21623)
Примечания по совместимости#
1D np.linalg.norm сохраняет типы входных данных с плавающей точкой, даже для скалярных результатов#
Ранее это приводило к повышению до float64 когда ord аргумент не был одним из явно перечисленных значений, например ord=3:
>>> f32 = np.float32([1, 2])
>>> np.linalg.norm(f32, 2).dtype
dtype('float32')
>>> np.linalg.norm(f32, 3)
dtype('float64') # numpy 1.22
dtype('float32') # numpy 1.23
Это изменение затрагивает только float32 и float16 векторы с ord
кроме -Inf, 0, 1, 2, и Inf.
(gh-17709)
Изменения в продвижении и сравнении структурированных (void) типов данных#
В целом, NumPy теперь определяет корректное, но слегка ограниченное приведение для структурированных типов данных, повышая подтипы каждого поля вместо вызова исключения:
>>> np.result_type(np.dtype("i,i"), np.dtype("i,d"))
dtype([('f0', '
Для продвижения совпадения имен полей, порядка и заголовков применяются, однако
отступы игнорируются.
Продвижение с участием структурированных типов данных теперь всегда гарантирует собственный порядок байтов для
всех полей (что может изменить результат np.concatenate)
и гарантирует, что результат будет «упакован», т.е. все поля упорядочены
непрерывно, а заполнение удалено.
См. Сравнение и приведение структур для дополнительных деталей.
The repr выровненных структур теперь никогда не будет выводиться в длинной форме, включая
offsets и itemsize если структура не включает заполнение, не
гарантированное align=True.
В соответствии с вышеуказанными изменениями в логике приведения, безопасность приведения была обновлена:
"equiv"требует соответствия имён и заголовков. Размер элемента может отличаться из-за заполнения."safe"допускает несовпадение имён полей и заголовковБезопасность приведения ограничена безопасностью приведения каждого включенного поля.
Порядок полей используется для определения безопасности приведения каждого отдельного поля. Ранее использовались имена полей, и только небезопасные приведения были возможны при несовпадении имён.
Основное важное изменение здесь заключается в том, что несоответствия имён теперь считаются «безопасными» преобразованиями.
(gh-19226)
NPY_RELAXED_STRIDES_CHECKING был удалён#
NumPy не может быть скомпилирован с NPY_RELAXED_STRIDES_CHECKING=0
больше. Ослабленные шаги (strides) были стандартом в течение многих лет, и
опция изначально была введена для обеспечения более плавного перехода.
(gh-20220)
np.loadtxt получил несколько изменений#
Подсчёт строк numpy.loadtxt был исправлен. loadtxt игнорирует полностью
пустые строки в файле, но учитывает их в max_rows.
Когда max_rows используется, и файл содержит пустые строки, они теперь
не будут учитываться. Ранее возможно, что результат содержал меньше,
чем max_rows строк, хотя доступно больше данных для чтения. Если требуется старое поведение, itertools.islice может использоваться:
import itertools
lines = itertools.islice(open("file"), 0, max_rows)
result = np.loadtxt(lines, ...)
Хотя в целом значительно быстрее и улучшено, numpy.loadtxt теперь может не удаться
преобразовать определенные строки в числа, которые ранее успешно считывались.
Наиболее важные случаи для этого:
Разбор значений с плавающей точкой, таких как
1.0в целые числа теперь устарело.Разбор шестнадцатеричных чисел с плавающей точкой, таких как
0x3p3завершится ошибкойAn
_ранее принимался как разделитель тысяч100_000. Теперь это приведёт к ошибке.
Если вы столкнулись с этими ограничениями, их можно обойти, передав соответствующие converters=. Теперь NumPy поддерживает передачу одного преобразователя для использования во всех столбцах, чтобы сделать это более удобным. Например, converters=float.fromhex может читать шестнадцатеричные числа с плавающей точкой и converters=int сможет прочитать 100_000.
Кроме того, сообщения об ошибках были в целом улучшены. Однако это означает,
что типы ошибок могут различаться. В частности, ValueError теперь всегда
вызывается при неудачном разборе отдельной записи.
(gh-20580)
Улучшения#
ndarray.__array_finalize__ теперь является вызываемым#
Это означает, что подклассы теперь могут использовать super().__array_finalize__(obj)
не беспокоясь о том, ndarray является ли их суперклассом или нет.
Фактический вызов остаётся пустой операцией.
(gh-20766)
Добавить поддержку VSX4/Power10#
С включением VSX4/Power10 новые инструкции, доступные в Power ISA 3.1, могут использоваться для ускорения некоторых операций NumPy, например, floor_divide, modulo и т.д.
(gh-20821)
np.fromiter теперь принимает объекты и подмассивы#
The numpy.fromiter функция теперь поддерживает объектные и
подмассивные dtypes. Пожалуйста, ознакомьтесь с документацией функции для
примеров.
(gh-20993)
Обнаружение функций математической библиотеки C теперь использует корректные сигнатуры#
Компиляция предваряется фазой обнаружения, чтобы определить, поддерживает ли
базовая libc определённые математические операции. Ранее этот код
не учитывал правильные сигнатуры. Исправление этого позволяет компиляцию
для wasm-ld бэкенд (компиляция для Web Assembly) и уменьшает
количество предупреждений.
(gh-21154)
np.kron теперь сохраняет информацию о подклассе#
np.kron сохраняет информацию о подклассе, такую как маскированные массивы, при вычислении произведения Кронекера входных данных
>>> x = ma.array([[1, 2], [3, 4]], mask=[[0, 1], [1, 0]])
>>> np.kron(x,x)
masked_array(
data=[[1, --, --, --],
[--, 4, --, --],
[--, --, 4, --],
[--, --, --, 16]],
mask=[[False, True, True, True],
[ True, False, True, True],
[ True, True, False, True],
[ True, True, True, False]],
fill_value=999999)
Предупреждение
np.kron вывод теперь следует ufunc ordering (multiply) для определения типа выходного класса
>>> class myarr(np.ndarray):
>>> __array_priority__ = -1
>>> a = np.ones([2, 2])
>>> ma = myarray(a.shape, a.dtype, a.data)
>>> type(np.kron(a, ma)) == np.ndarray
False # Before it was True
>>> type(np.kron(a, ma)) == myarr
True
(gh-21262)
Улучшения и изменения производительности#
Быстрее np.loadtxt#
numpy.loadtxt теперь обычно намного быстрее, чем раньше, так как большая часть теперь реализована на C.
(gh-20580)
Более быстрые операторы редукции#
Операции редукции, такие как numpy.sum, numpy.prod, numpy.add.reduce,
numpy.logical_and.reduce на непрерывных целочисленных массивах теперь
гораздо быстрее.
(gh-21001)
Быстрее np.where#
numpy.where теперь намного быстрее, чем ранее, на непредсказуемых/случайных
входных данных.
(gh-21130)
Более быстрые операции со скалярами NumPy#
Многие операции со скалярами NumPy теперь значительно быстрее, хотя
редкие операции (например, с 0-D массивами, а не со скалярами) могут быть медленнее
в некоторых случаях.
Однако даже с этими улучшениями пользователи, желающие получить максимальную производительность
для своих скаляров, могут захотеть преобразовать известный скаляр NumPy в Python
скаляр, используя scalar.item().
(gh-21188)
Быстрее np.kron#
numpy.kron примерно на 80% быстрее, так как произведение теперь вычисляется
с использованием вещания.
(gh-21354)