Примечания к выпуску NumPy 1.19.0#
Этот выпуск NumPy отмечен удалением большого количества технического долга: поддержка Python 2 была удалена, многие устаревшие функции были исключены, и документация была улучшена. Полировка модуля random продолжается с исправлениями ошибок и улучшенной удобностью использования из Cython.
Версии Python, поддерживаемые в этом выпуске: 3.6-3.8. Разработчикам нижестоящих проектов следует использовать Cython >= 0.29.16 для поддержки Python 3.8 и OpenBLAS >= 3.7, чтобы избежать проблем на архитектуре Skylake.
Основные моменты#
Совместимость кода с версиями Python < 3.6 (включая Python 2) была удалена как из кода Python, так и из C-кода. Прокладки в
numpy.compatостанется для поддержки сторонних пакетов, но они могут быть устаревшими в будущем релизе. Обратите внимание, что 1.19.x будет не компилировать с более ранними версиями Python из-за использования f-строк.(gh-15233)
Устаревшие устаревания#
numpy.insert и numpy.delete больше не может принимать ось для 0d массивов#
Это завершает устаревание с версии 1.9, где когда axis аргумент был
передан в вызов ~numpy.insert и ~numpy.delete на 0d массиве,
axis и obj аргумент и индексы будут полностью проигнорированы.
В этих случаях, insert(arr, "nonsense", 42, axis=0) фактически перезапишет весь массив, в то время как delete(arr, "nonsense", axis=0) будет arr.copy()
Теперь передача axis на 0d массиве вызывает ~numpy.AxisError.
(gh-15802)
numpy.delete больше не игнорирует индексы вне границ#
На этом завершаются устаревания из версий 1.8 и 1.9, где np.delete игнорировало бы как отрицательные, так и выходящие за границы элементы в последовательности индексов. Это противоречило его поведению при передаче одного индекса.
Теперь элементы за пределами диапазона вызывают IndexError, а отрицательные элементы индексируются с
конца.
(gh-15804)
numpy.insert и numpy.delete больше не принимают нецелочисленные индексы#
Это завершает устаревание с версии 1.9, где разрешались последовательности нецелочисленных индексов и приводились к целым числам. Теперь передача последовательностей нецелочисленных индексов вызывает IndexError, так же, как это происходит при передаче одного нецелочисленного скаляра.
(gh-15805)
numpy.delete больше не преобразует булевы индексы в целые числа#
Это завершает устаревание с версии 1.8, где np.delete преобразовывал логические массивы и скаляры, переданные в качестве аргумента индекса, в целочисленные индексы. Теперь поведение заключается в обработке логических массивов как маски и вызове ошибки для логических скаляров.
(gh-15815)
Примечания по совместимости#
Изменен поток случайных величин с numpy.random.Generator.dirichlet#
Исправлена ошибка в генерации случайных величин для распределения Дирихле с малыми значениями 'alpha' путём использования другого алгоритма, когда
max(alpha) < 0.1. Из-за изменения поток вариантов, генерируемых dirichlet в этом случае будет отличаться от предыдущих
релизов.
(В то время как другие формы присваивания распакуют присваиваемый массив:)
Продвижение скаляров в PyArray_ConvertToCommonType#
Повышение смешанных скаляров и массивов в PyArray_ConvertToCommonType
был изменен для соответствия тем, которые используются np.result_type.
Это означает, что входные данные, такие как (1000, np.array([1], dtype=np.uint8)))
теперь вернет uint16 типов данных. В большинстве случаев поведение не изменилось. Обратите внимание, что использование этой функции C-API обычно не рекомендуется. Это также исправляет np.choose вести себя так же, как и остальная часть NumPy в этом отношении.
(gh-14933)
Слоты Fasttake и fastputmask устарели и установлены в NULL#
Слоты fasttake и fastputmask теперь никогда не используются и должны всегда устанавливаться в NULL. Это не изменит поведение. Однако, если пользовательский dtype установит один из них, будет выдано предупреждение DeprecationWarning.
(gh-14942)
np.ediff1d поведение при приведении типов с to_end и to_begin#
np.ediff1d теперь использует "same_kind" правило приведения для его дополнительного to_end и to_begin аргументов. Это
обеспечивает безопасность типов, за исключением случаев, когда входной массив имеет меньший
целочисленный тип, чем to_begin или to_end.
В редких случаях поведение будет более строгим, чем
ранее в версиях 1.16 и 1.17. Это необходимо для решения проблем
с плавающей точкой NaN.
(gh-14981)
Преобразование пустых объектов, подобных массивам, в массивы NumPy#
Объекты с len(obj) == 0 которые реализуют интерфейс "подобный массиву",
то есть объект, реализующий obj.__array__(),
obj.__array_interface__, obj.__array_struct__, или интерфейс буфера Python, которые также являются последовательностями (например, объекты Pandas), теперь всегда будут сохранять свою форму корректно при преобразовании в массив. Если такой объект имеет форму (0, 1) ранее он мог
быть преобразован в массив формы (0,) (теряя все размерности
после первой 0).
(gh-14995)
Удалено multiarray.int_asbuffer#
В рамках продолжающегося удаления совместимости с Python 2,
multiarray.int_asbuffer был удалён. В Python 3 он выбрасывал
NotImplementedError и не использовался внутренне. Ожидается, что
не существует случаев использования этого метода в Python 3.
(gh-15229)
numpy.distutils.compat был удалён#
Этот модуль содержал только функцию get_exception(), который использовался как:
try:
...
except Exception:
e = get_exception()
Его целью была обработка изменения синтаксиса, введённого в Python 2.6, с
except Exception, e: to except Exception as e:, что было необходимо только
для кодовых баз, поддерживающих Python 2.5 и более старые версии.
(gh-15255)
issubdtype больше не интерпретирует float как np.floating#
numpy.issubdtype имел FutureWarning начиная с NumPy 1.14, срок действия которого истёк. Это означает, что определённые входные данные, где второй аргумент не был ни типом данных, ни скалярным типом NumPy (например, строка или тип Python, такой как int или float) теперь будет согласован с передачей np.dtype(arg2).type. Это делает результат согласованным с ожиданиями и приводит к ложному результату в некоторых случаях, которые ранее возвращали истину.
(gh-15773)
Изменить вывод round на скалярах для согласованности с Python#
Вывод __round__ dunder-метод и, следовательно, встроенный Python round был изменён на Python int чтобы быть согласованным с вызовом в Python float объектов при вызове без аргументов. Ранее он возвращал скаляр типа np.dtype который был передан.
(gh-15840)
The numpy.ndarray конструктор больше не интерпретирует strides=() как strides=None#
Первое изменилось, чтобы иметь ожидаемое значение установки
numpy.ndarray.strides to (), в то время как последний продолжает приводить к
автоматическому выбору шагов.
(gh-15882)
Изменены C-уровневые преобразования строк в дату/время#
Приведения строк на уровне C были упрощены. Это изменение
также исправляет приведение строк к datetime и timedelta, чтобы они работали
корректно (т.е. как приведения Python с использованием string_arr.astype("M8")
в то время как ранее приведение типа вело себя как
string_arr.astype(np.int_).astype("M8").
Это влияет только на код, использующий низкоуровневый C-API для ручного приведения
(не полного приведения массивов) отдельных скалярных значений или использования, например,
PyArray_GetCastFunc, и поэтому не должен затрагивать подавляющее большинство пользователей.
(gh-16068)
SeedSequence с маленькими сидами больше не конфликтует с порождением#
Маленькие начальные значения (меньше чем 2**96) ранее неявно дополнялись нулями до
128 бит, размера внутреннего пула энтропии. При порождении ключ порождения
конкатенировался перед дополнением нулями. Поскольку первый ключ порождения — это (0,),
маленькие сиды перед spawn создавали те же состояния, что и первый spawned
SeedSequence. Теперь seed явно дополняется нулями до внутреннего
размера пула перед конкатенацией ключа порождения. Созданные SeedSequences даст
другие результаты, чем в предыдущем релизе. Незапущенные
SeedSequences всё равно даст те же результаты.
(gh-16551)
Устаревшие функции#
Устаревание автоматического dtype=object для рваного ввода#
Вызов np.array([[1, [1, 2, 3]]) выдаст DeprecationWarning в соответствии с NEP 34. Пользователям следует явно использовать dtype=object чтобы избежать предупреждения.
(gh-15119)
Передача shape=0 к фабричным функциям в numpy.rec устарел#
0 рассматривается как особый случай и имеет псевдоним None в функциях:
numpy.core.records.fromarraysnumpy.core.records.fromrecordsnumpy.core.records.fromstringnumpy.core.records.fromfile
В будущем, 0 не будет обрабатываться особым образом и будет рассматриваться как длина массива,
как и любое другое целое число.
(gh-15217)
Устаревание, вероятно, неиспользуемых функций C-API#
Следующие функции C-API, вероятно, не используются и устарели:
PyArray_GetArrayParamsFromObjectPyUFunc_GenericFunctionPyUFunc_SetUsesArraysAsData
В большинстве случаев PyArray_GetArrayParamsFromObject следует заменить
преобразованием в массив, в то время как PyUFunc_GenericFunction может быть
заменён на PyObject_Call (см. документацию для подробностей).
(gh-15427)
Преобразование определенных типов в dtypes устарело#
Суперклассы скалярных типов, такие как np.integer, np.generic,
или np.inexact теперь будет выдавать предупреждение об устаревании при преобразовании в dtype (или использовании в аргументе ключевого слова dtype). Причина в том, что np.integer преобразуется в np.int_,
в то время как ожидалось, что он будет представлять любой целое число (например, также
int8, int16, и т.д.
Например, dtype=np.floating в настоящее время идентичен
dtype=np.float64, даже если также np.float32 является подклассом
np.floating.
(gh-15534)
Устаревание round для np.complexfloating скаляры#
Вывод __round__ dunder-метод и, следовательно, встроенная функция Python
round был устаревшим для комплексных скаляров. Это не влияет
np.round.
(gh-15840)
numpy.ndarray.tostring() устарел в пользу tobytes()#
~numpy.ndarray.tobytes существует с версии 1.9, но до этого релиза ~numpy.ndarray.tostring не выдавало предупреждения. Изменение для выдачи предупреждения приводит NumPy в соответствие со встроенным array.array методы с
тем же именем.
(gh-15867)
Изменения в C API#
Улучшенная поддержка для const размерности в функциях API#
Следующие функции теперь принимают постоянный массив npy_intp:
PyArray_BroadcastToShapePyArray_IntTupleFromIntpPyArray_OverflowMultiplyList
Ранее вызывающей стороне приходилось снимать константность для вызова этих функций.
(gh-15251)
Const qualify UFunc внутренние циклы#
UFuncGenericFunction теперь ожидает указатели на const dimension и
strides в качестве аргументов. Это означает, что внутренние циклы больше не могут изменять ни dimension или strides. Это изменение приводит к
incompatible-pointer-types предупреждение, заставляющее пользователей либо игнорировать
предупреждения компилятора, либо квалифицировать const свои собственные сигнатуры циклов.
(gh-15355)
Новые возможности#
numpy.frompyfunc теперь принимает аргумент identity#
Это позволяет numpy.ufunc.identity атрибут, который должен быть установлен на
результирующей универсальной функции, что позволяет использовать его для пустых и многомерных
вызовов numpy.ufunc.reduce.
(gh-8255)
np.str_ скаляры теперь поддерживают протокол буфера#
np.str_ массивы всегда хранятся как UCS4, поэтому соответствующие скаляры
теперь раскрывают это через интерфейс буфера, означая
memoryview(np.str_('test')) теперь работает.
(gh-15385)
subok опция для numpy.copy#
Новый аргумент, subok, был добавлен в numpy.copy чтобы позволить пользователям переключать
поведение numpy.copy относительно подклассов массивов. Значение по умолчанию
равно False что согласуется с поведением numpy.copy для предыдущих версий numpy. Чтобы создать копию, которая сохраняет подкласс массива с
numpy.copy, вызовите np.copy(arr, subok=True). Это дополнение лучше документирует, что поведение по умолчанию numpy.copy отличается от
numpy.ndarray.copy метод, который по умолчанию учитывает подклассы массивов.
(gh-15685)
numpy.linalg.multi_dot теперь принимает out аргумент#
out может использоваться для избежания создания ненужных копий конечного продукта, вычисленного numpy.linalg.multidot.
(gh-15715)
keepdims параметр для numpy.count_nonzero#
Параметр keepdims был добавлен в numpy.count_nonzeroПараметр имеет то же значение, что и в функциях редукции, таких как numpy.sum или numpy.mean.
(gh-15870)
equal_nan параметр для numpy.array_equal#
Аргумент ключевого слова equal_nan был добавлен в numpy.array_equal.
equal_nan является логическим значением, которое переключает, следует ли nan значения считаются равными при сравнении (по умолчанию False). Это соответствует API, используемому в
родственных функциях, таких как numpy.isclose и numpy.allclose.
(gh-16128)
Улучшения#
Улучшить обнаружение функций процессора#
Заменить npy_cpu_supports который был специфичным для gcc механизмом проверки поддержки
AVX с более общими функциями npy_cpu_init и npy_cpu_have, и
предоставлять результаты через NPY_CPU_HAVE c-макрос, а также python-уровень
__cpu_features__ словарь.
(gh-13421)
Использовать 64-битный целочисленный размер на 64-битных платформах в резервном lapack_lite#
Использовать 64-битный целочисленный размер на 64-битных платформах в резервной библиотеке LAPACK, которая используется, когда в системе нет установленного LAPACK, позволяя ей работать с линейной алгеброй для больших массивов.
(gh-15218)
Использовать встроенную функцию AVX512 для реализации np.exp когда входные данные np.float64#
Использовать встроенную функцию AVX512 для реализации np.exp когда входные данные np.float64, что может улучшить производительность np.exp с np.float64 ввод 5-7 раз
быстрее, чем раньше. _multiarray_umath.so модуль вырос примерно на 63 КБ
на linux64.
(gh-15648)
Возможность отключения madvise hugepages#
В Linux NumPy ранее добавил поддержку madavise hugepages, что может улучшить производительность для очень больших массивов. К сожалению, в старых версиях ядра это приводило к снижению производительности, поэтому по умолчанию поддержка отключена для ядер версии ниже 4.6. Чтобы переопределить настройки по умолчанию, можно использовать переменную окружения:
NUMPY_MADVISE_HUGEPAGE=0
или установите значение 1 для принудительного включения поддержки. Обратите внимание, что это имеет значение только если операционная система настроена на использование прозрачных огромных страниц через madvise.
(gh-15769)
numpy.einsum принимает NumPy int64 тип в списке индексов#
Больше не возникает ошибка типа, когда numpy.einsum передаётся NumPy int64 массив в качестве списка индексов.
(gh-16080)
np.logaddexp2.identity изменено на -inf#
Универсальная функция (ufunc) ~numpy.logaddexp2 теперь имеет идентичность -inf, позволяя вызывать его на пустых последовательностях. Это соответствует идентичности ~numpy.logaddexp.
(gh-16102)
Изменения#
Удалена обработка дополнительного аргумента для __array__#
Путь выполнения и тест присутствуют в коде с NumPy 0.4 для двухаргументного
варианта __array__(dtype=None, context=None). Она активировалась при вызове ufunc(op) или ufunc.reduce(op) if op.__array__ существовал.
Однако этот вариант не документирован, и неясно, каково было намерение
для его использования. Он был удален.
(gh-15118)
numpy.random._bit_generator перемещено в numpy.random.bit_generator#
Для того чтобы предоставить numpy.random.BitGenerator и
numpy.random.SeedSequence в Cython, _bitgenerator модуль теперь
публичный как numpy.random.bit_generator
Доступ Cython к случайным распределениям предоставляется через pxd файл#
c_distributions.pxd предоставляет доступ к функциям C, стоящим за многими распределениями случайных величин из Cython, что удобно для их использования и расширения.
(gh-15463)
Исправлено eigh и cholesky методы в numpy.random.multivariate_normal#
Ранее, при передаче method='eigh' или method='cholesky',
numpy.random.multivariate_normal генерировал выборки из неправильного распределения. Теперь это исправлено.
(gh-15872)
Исправлена реализация перехода в MT19937.jumped#
Это исправление изменяет поток, генерируемый из перепрыгнувших генераторов MT19937. Оно не влияет на поток, создаваемый с использованием RandomState или MT19937 которые непосредственно заполняются.
Перевод прыгающего кода для MT19937 содержал обратный порядок цикла. MT19937.jumped соответствует оригинальной реализации Макото Мацумото методов прыжка Хорнера и скользящего окна.
(gh-16153)