Примечания к выпуску NumPy 1.13.0#
Эта версия поддерживает Python 2.7 и 3.4 - 3.6.
Основные моменты#
Операции, такие как
a + b + cбудет повторно использовать временные переменные на некоторых платформах, что приводит к меньшему использованию памяти и более быстрому выполнению.Операции на месте проверяют, перекрываются ли входные данные с выходными, и создают временные объекты, чтобы избежать проблем.
Новый
__array_ufunc__атрибут предоставляет улучшенную возможность для классов переопределять поведение универсальных функций по умолчанию.Новый
np.blockфункция для создания блокированных массивов.
Новые функции#
Новый
np.positiveуниверсальная функция.Новый
np.divmodufunc предоставляет более эффективный divmod.Новый
np.isnatufunc тесты для специальных значений NaT.Новый
np.heavisideufunc вычисляет функцию Хевисайда.Новый
np.isinфункция, улучшаетin1d.Новый
np.blockфункция для создания блокированных массивов.Новый
PyArray_MapIterArrayCopyIfOverlapдобавлено в NumPy C-API.
Подробности см. ниже.
Устаревшие функции#
Вызов
np.fix,np.isposinf, иnp.isneginfсf(x, y=out)устарел - аргумент должен передаваться какf(x, out=out), что соответствует другим интерфейсам, подобным ufunc.Использование C-API
NPY_CHARномер типа, устаревший с версии 1.7, теперь будет вызывать предупреждения об устаревании во время выполнения. Расширения, собранные с более старыми версиями f2py, нужно перекомпилировать, чтобы удалить предупреждение.np.ma.argsort,np.ma.minimum.reduce, иnp.ma.maximum.reduceдолжен вызываться с явным ось аргумент при применении к массивам с более чем 2 измерениями, так как значение по умолчанию этого аргумента (None) не согласуется с остальной частью numpy (-1,0, и0, соответственно).np.ma.MaskedArray.miniустарел, так как он почти дублирует функциональностьnp.MaskedArray.min. Точно такое же поведение можно получить с помощьюnp.ma.minimum.reduce.Форма с одним аргументом функции
np.ma.minimumиnp.ma.maximumустарело.np.maximum.np.ma.minimum(x)теперь должно писаться какnp.ma.minimum.reduce(x), что согласуется с тем, как это было бы сделано сnp.minimum.Вызов
ndarray.conjugateна нечисловых типах данных устарело (оно должно соответствовать поведениюnp.conjugate, что вызывает ошибку).Вызов
expand_dimsкогдаaxisключевое слово не удовлетворяет-a.ndim - 1 <= axis <= a.ndim, гдеaявляется массивом, который преобразуется, устарел.
Будущие изменения#
Присваивание между структурированными массивами с разными именами полей изменится в NumPy 1.14. Ранее поля в dst устанавливались в значение одноименного поля в src. В numpy 1.14 поля будут присваиваться «по позиции»: n-е поле dst будет установлено в n-е поле исходного массива. Обратите внимание, что
FutureWarningподнятое в NumPy 1.12 неправильно сообщало об этом изменении как запланированном для NumPy 1.13, а не NumPy 1.14.
Изменения в системе сборки#
numpy.distutilsтеперь автоматически определяет зависимости C-файлов с компиляторами, совместимыми с GCC.
Примечания по совместимости#
Изменения типа ошибки#
numpy.hstack()теперь выбрасываетValueErrorвместоIndexErrorкогда входные данные пусты.Функции, принимающие аргумент axis, когда этот аргумент выходит за пределы диапазона, теперь выбрасывают
np.AxisErrorвместо смесиIndexErrorиValueError. Для обратной совместимости,AxisErrorподклассы обоих этих.
Кортеж типов данных объектов#
Поддержка была удалена для некоторых неясных типов данных, которые были непреднамеренно разрешены, вида (old_dtype, new_dtype), где любой из dtypes
является или содержит object dtype. В качестве исключения, типы данных вида
(object, [('name', object)]) все еще поддерживаются из-за свидетельств существующего использования.
DeprecationWarning в ошибку#
См. раздел Изменения для более подробной информации.
partition, TypeError при использовании нецелочисленного индекса раздела.NpyIter_AdvancedNew, ValueError приoa_ndim == 0иop_axesравен NULLnegative(bool_), TypeError при применении отрицания к булевым значениям.subtract(bool_, bool_), TypeError при вычитании булева значения из булева.np.equal, np.not_equal, идентичность объекта не переопределяет неудачное сравнение.np.equal, np.not_equal, идентичность объекта не переопределяет небулево сравнение.Устаревшее поведение булевой индексации удалено. Подробности см. в разделе «Изменения» ниже.
Устаревший
np.alterdot()иnp.restoredot()удалён.
FutureWarning об изменении поведения#
См. раздел Изменения для более подробной информации.
numpy.averageсохраняет подклассыarray == Noneиarray != Noneвыполнять поэлементное сравнение.np.equal, np.not_equal, идентичность объекта не переопределяет результат сравнения.
dtypes теперь всегда истинны#
Ранее bool(dtype) будет возвращаться к реализации по умолчанию на Python, которая проверяла, если len(dtype) > 0. Поскольку dtype объекты реализуют __len__ как количество полей записи, bool скалярных типов данных будет вычисляться как False, что было неинтуитивно. Теперь bool(dtype) == True
для всех типов данных.
__getslice__ и __setslice__ больше не нужны в ndarray подклассы#
При наследовании от np.ndarray в Python 2.7 больше не _необходимо_ реализовывать __*slice__ в производном классе, как __*item__ будет корректно перехватывать
эти вызовы.
Любой код, который реализовывал это, будет работать точно так же, как и раньше. Код, который
вызывает ndarray.__getslice__ (например, через super(...).__getslice__) теперь будет выдавать DeprecationWarning - .__getitem__(slice(start, end)) следует использовать вместо этого.
Индексирование MaskedArrays/Constants с помощью ... (многоточие) теперь возвращает MaskedArray#
Это поведение зеркально отражает поведение np.ndarray и учитывает вложенные массивы в MaskedArrays типа object dtype, а также многоточие в сочетании с другими формами индексирования.
Изменения в C API#
GUfuncs на пустых массивах и удаление оси NpyIter#
Теперь разрешено удалять ось нулевого размера из NpyIter. Это может означать, что код, удаляющий оси из NpyIter, должен добавить дополнительную проверку при доступе к удалённым измерениям позже.
Самое крупное последующее изменение заключается в том, что gufunc теперь могут иметь нулевые внутренние размерности. Это означает, что gufunc теперь должен учитывать пустую внутреннюю размерность, тогда как ранее это было невозможно и вызывало ошибку.
Для большинства gufunc'ов изменений не требуется. Однако теперь возможно
для gufunc'ов с сигнатурой, такой как (..., N, M) -> (..., M) чтобы вернуть допустимый результат, если N=0 без дополнительного кода обёртки.
PyArray_MapIterArrayCopyIfOverlap добавлено в NumPy C-API#
Аналогично PyArray_MapIterArray но с дополнительным copy_if_overlap
аргумент. Если copy_if_overlap != 0, проверяет, имеет ли входные данные перекрытие памяти с
любым из других массивов, и при необходимости создаёт копии, чтобы избежать проблем, если
входные данные изменяются во время итерации. См. документацию для более полного
описания.
Новые возможности#
__array_ufunc__ добавлен#
Это переименованный и переработанный __numpy_ufunc__. Любой класс, подкласс ndarray или нет, может определить этот метод или установить его в None чтобы
переопределить поведение ufuncs NumPy. Это работает очень похоже на
__mul__ и другие процедуры бинарных операций. См. документацию для
более подробного описания реализации и поведения этой новой
опции. API является временным, мы пока не гарантируем обратную совместимость,
так как изменения могут быть внесены в зависимости от обратной связи. См. NEP 13 и
документация для получения дополнительной информации.
Новый positive универсальная функция (ufunc)#
Эта универсальная функция соответствует унарной +, но в отличие от + для ndarray вызовет ошибку, если значения массива не поддерживают числовые операции.
Новый divmod универсальная функция (ufunc)#
Этот ufunc соответствует встроенному в Python divmod, и используется для реализации
divmod при вызове для массивов numpy. np.divmod(x, y) вычисляет результат, эквивалентный (np.floor_divide(x, y), np.remainder(x, y)) но примерно в два раза быстрее, чем вызов функций по отдельности.
np.isnat тесты ufunc для специальных значений даты и времени NaT#
Новый ufunc np.isnat находит позиции специальных значений NaT в массивах datetime и timedelta. Это аналогично np.isnan.
np.heaviside ufunc вычисляет функцию Хевисайда#
Новая функция np.heaviside(x, h0) (a ufunc) вычисляет функцию Хевисайда:
{ 0 if x < 0,
heaviside(x, h0) = { h0 if x == 0,
{ 1 if x > 0.
np.block функция для создания блокированных массивов#
Добавить новый block функция к текущим функциям стекирования vstack,
hstack, и stack. Это позволяет конкатенацию по нескольким осям одновременно, с синтаксисом, аналогичным созданию массива, но где элементы сами могут быть массивами. Например:
>>> A = np.eye(2) * 2
>>> B = np.eye(3) * 3
>>> np.block([
... [A, np.zeros((2, 3))],
... [np.ones((3, 2)), B ]
... ])
array([[ 2., 0., 0., 0., 0.],
[ 0., 2., 0., 0., 0.],
[ 1., 1., 3., 0., 0.],
[ 1., 1., 0., 3., 0.],
[ 1., 1., 0., 0., 3.]])
Хотя в первую очередь полезно для блочных матриц, это работает для произвольных размерностей массивов.
Это похоже на нотацию квадратных скобок Matlab для создания блочных матриц.
isin функция, улучшая in1d#
Новая функция isin проверяет, присутствует ли каждый элемент N-мерного массива где-либо во втором массиве. Это улучшенная версия in1d который сохраняет форму первого массива.
Временное исключение#
На платформах, предоставляющих backtrace функция NumPy попытается избежать
создания временных объектов в выражениях, включающих базовые числовые типы.
Например d = a + b + c преобразуется в d = a + b; d += c что может
улучшить производительность для больших массивов, так как требуется меньше пропускной способности памяти
для выполнения операции.
axes аргумент для unique#
В N-мерном массиве пользователь теперь может выбрать ось, вдоль которой искать дублирующиеся N-1-мерные элементы, используя numpy.unique. Исходное поведение восстанавливается, если axis=None (по умолчанию).
np.gradient теперь поддерживает неравномерно распределенные данные#
Теперь пользователи могут указывать непостоянный интервал для данных.
В частности, np.gradient теперь может принимать:
Одиночный скаляр для указания расстояния выборки для всех размерностей.
N скаляров для указания постоянного расстояния выборки для каждого измерения. Т.е.
dx,dy,dz, …N массивов для указания координат значений вдоль каждого измерения F. Длина массива должна соответствовать размеру соответствующего измерения
Любая комбинация N скаляров/массивов со значением 2. и 3.
Это означает, что, например, теперь можно сделать следующее:
>>> f = np.array([[1, 2, 6], [3, 4, 5]], dtype=np.float_)
>>> dx = 2.
>>> y = [1., 1.5, 3.5]
>>> np.gradient(f, dx, y)
[array([[ 1. , 1. , -0.5], [ 1. , 1. , -0.5]]),
array([[ 2. , 2. , 2. ], [ 2. , 1.7, 0.5]])]
Поддержка возврата массивов произвольной размерности в apply_along_axis#
Ранее только скаляры или одномерные массивы могли возвращаться функцией, переданной
в apply_along_axis. Теперь он может возвращать массив любой размерности (включая 0D), и форма этого массива заменяет ось массива, по которому выполняется итерация.
.ndim свойство добавлено в dtype в дополнение к .shape#
Для согласованности с ndarray и broadcast, d.ndim является сокращением для len(d.shape).
Поддержка tracemalloc в Python 3.6#
NumPy теперь поддерживает трассировку памяти с tracemalloc модуле Python 3.6 или новее. Выделения памяти из NumPy помещаются в домен, определённый
numpy.lib.tracemalloc_domainОбратите внимание, что выделение памяти в NumPy не будет отображаться в tracemalloc более ранних версий Python.
NumPy может быть собран с отладочной проверкой расслабленных шагов#
Установка NPY_RELAXED_STRIDES_DEBUG=1 в окружении, когда включена проверка расслабленных шагов, вызовет компиляцию NumPy с затронутыми шагами, установленными на максимальное значение npy_intp, чтобы помочь обнаружить недопустимое использование шагов в нижестоящих проектах. При включении недопустимое использование часто приводит к возникновению ошибки, но точный тип ошибки зависит от деталей кода. TypeError и OverflowError наблюдались на практике.
Ранее эта опция была отключена для релизов и включена в master, и переключение между ними требовало редактирования кода. Теперь она отключена по умолчанию, но может быть включена для тестовых сборок.
Улучшения#
Поведение универсальных функций для перекрывающихся входных данных#
Операции, в которых входные и выходные операнды ufunc имеют перекрытие памяти, давали неопределённые результаты в предыдущих версиях NumPy из-за проблем зависимости данных. В NumPy 1.13.0 результаты таких операций теперь определены как такие же, как для эквивалентных операций без перекрытия памяти.
Затронутые операции теперь создают временные копии по мере необходимости для устранения зависимости данных. Поскольку обнаружение этих случаев вычислительно затратно, используется эвристика, которая в редких случаях может привести к ненужным временным копиям. Для операций, где зависимость данных достаточно проста для анализа эвристикой, временные копии не будут создаваться, даже если массивы перекрываются, если можно вывести, что копии не нужны. Например, ``np.add(a, b, out=a)`` не будет включать копии.
Для иллюстрации ранее неопределенной операции:
>>> x = np.arange(16).astype(float)
>>> np.add(x[1:], x[:-1], out=x[1:])
В NumPy 1.13.0 последняя строка гарантированно эквивалентна:
>>> np.add(x[1:].copy(), x[:-1].copy(), out=x[1:])
Аналогичная операция с простой не проблемной зависимостью данных:
>>> x = np.arange(16).astype(float)
>>> np.add(x[1:], x[:-1], out=x[:-1])
Он продолжит давать те же результаты, что и в предыдущих версиях NumPy, и не будет включать ненужные временные копии.
Изменение также применяется к бинарным операциям на месте, например:
>>> x = np.random.rand(500, 500)
>>> x += x.T
Это утверждение теперь гарантированно эквивалентно x[...] = x + x.T, тогда как в предыдущих версиях NumPy результаты были неопределёнными.
Частичная поддержка 64-битных расширений f2py с MinGW#
Расширения, включающие библиотеки Fortran, теперь можно собирать с использованием бесплатного MinGW набор инструментов, также под Python 3.5. Это лучше всего работает для расширений, которые только выполняют вычисления и умеренно используют среду выполнения (например, чтение и запись файлов). Обратите внимание, что это не устраняет необходимость в Mingwpy; если вы активно используете среду выполнения, вы, скорее всего, столкнетесь с проблемы. Вместо этого, его следует рассматривать как временное решение, пока Mingwpy не станет полностью функциональным.
Расширения также могут быть скомпилированы с использованием набора инструментов MinGW с использованием библиотеки времени выполнения из (перемещаемого) дистрибутива WinPython 3.4, что может быть полезно для программ с интерфейсом PySide1/Qt4.
Улучшения производительности для packbits и unpackbits#
Функции numpy.packbits с булевым входом и numpy.unpackbits были
оптимизированы для значительного ускорения работы с непрерывными данными.
Исправление информации о числах с плавающей точкой long double для PPC#
В предыдущих версиях NumPy, finfo функция вернула неверную информацию о double double формат longdouble тип float на Power PC (PPC). Некорректные значения возникли из-за неспособности алгоритма NumPy обработать переменное количество цифр в мантиссе, что является особенностью PPC long doubles. Этот выпуск обходит проблемный алгоритм, используя эвристики для обнаружения формата PPC double double. Побочным эффектом использования этих эвристик является то, что finfo
функция быстрее, чем в предыдущих выпусках.
Улучшенное представление по умолчанию для ndarray подклассы#
Подклассы ndarray без repr специализация теперь правильно отступает
их строки данных и типов.
Более надежные сравнения маскированных массивов#
Сравнения маскированных массивов содержали ошибки для маскированных скаляров и не работали для структурированных массивов размерностью больше одного. Обе проблемы теперь решены. В процессе было обеспечено, что при получении результата для структурированного массива маскированные поля правильно игнорируются, т.е. результат равен, если все поля, которые не маскированы в обоих массивах, равны, что делает поведение идентичным тому, что получается при сравнении неструктурированного маскированного массива и последующем выполнении .all() по некоторой оси.
np.matrix с булевыми элементами теперь можно создавать с использованием строкового синтаксиса#
np.matrix завершалось неудачей при попытке использования с булевыми значениями, например,
np.matrix('True'). Теперь это работает как ожидалось.
Больше linalg операции теперь принимают пустые векторы и матрицы#
Все следующие функции в np.linalg теперь работают при подаче входных массивов с 0 в последних двух измерениях: det, slogdet, pinv,
eigvals, eigvalsh, eig, eigh.
Версия LAPACK в комплекте теперь 3.2.2#
NumPy поставляется с минимальной реализацией lapack для систем без установленной библиотеки lapack под названием lapack_lite. Это было
обновлено с LAPACK 3.0.0 (30 июня 1999) до LAPACK 3.2.2 (30 июня 2010). См.
Журналы изменений LAPACK для подробностей обо всех изменениях, которые это влечет.
Хотя новые функции не представлены через numpy, это исправляет некоторые ошибки
относительно размеров "рабочего пространства", и в некоторых местах могут использоваться более быстрые алгоритмы.
reduce of np.hypot.reduce и np.logical_xor разрешено в большем количестве случаев#
Теперь работает с пустыми массивами, возвращая 0, и может выполнять свёртку по нескольким осям. Ранее ValueError было выброшено в этих случаях.
Лучше repr массивов объектов#
Объектные массивы, содержащие сами себя, больше не вызывают ошибку рекурсии.
Массивы объектов, которые содержат list объекты теперь выводятся таким образом, чтобы четко различать 2D массив объектов и 1D массив объектов списков.
Изменения#
argsort на маскированных массивах принимает те же аргументы по умолчанию, что и sort#
По умолчанию, argsort теперь помещает замаскированные значения в конец отсортированного
массива, аналогично тому, как sort уже сделали. Кроме того,
end_with аргумент добавляется к argsort, для согласованности с sortОбратите внимание, что этот аргумент не добавляется в конце, поэтому ломает любой код, который передавал fill_value в качестве позиционного аргумента.
average теперь сохраняет подклассы#
Для подклассов ndarray, numpy.average теперь будет возвращать экземпляр подкласса, соответствуя поведению большинства других функций NumPy, таких как meanКак следствие, вызовы, которые возвращали скаляр, теперь могут возвращать скаляр подкласса массива.
array == None и array != None выполнить покомпонентное сравнение#
Ранее эти операции возвращали скаляры False и True соответственно.
np.equal, np.not_equal для массивов объектов игнорирует идентичность объектов#
Ранее эти функции всегда рассматривали идентичные объекты как равные. Это имело эффект переопределения сбоев сравнения, сравнения объектов, которые не возвращали булевы значения, таких как np.arrays, и сравнения объектов, где результаты отличались от идентичности объектов, таких как NaN.
Булева индексация изменяет#
Булевы массиво-подобные объекты (такие как списки булевых значений Python) всегда обрабатываются как булевы индексы.
Булевы скаляры (включая python
True) являются допустимыми булевыми индексами и никогда не рассматриваются как целые числа.Булевы индексы должны соответствовать размерности оси, которую они индексируют.
Булевы индексы, используемые в левой части присваивания, должны соответствовать размерностям правой части.
Булева индексация в скалярных массивах возвращает новый одномерный массив. Это означает, что
array(1)[array(True)]даетarray([1])а не исходный массив.
np.random.multivariate_normal поведение с плохой ковариационной матрицей#
Теперь можно настроить поведение функции при работе с ковариационной матрицей, используя два новых ключевых аргумента:
tolможет использоваться для указания допуска при проверке того, что ковариационная матрица является положительно полуопределенной.check_validможет использоваться для настройки того, что функция будет делать при наличии матрицы, которая не является положительно полуопределённой. Допустимые варианты:ignore,warnиraise. Значение по умолчанию,warnсохраняет поведение, использованное в предыдущих выпусках.
assert_array_less сравнивает np.inf и -np.inf теперь#
Ранее, np.testing.assert_array_less игнорировал все бесконечные значения. Это
не является ожидаемым поведением как согласно документации, так и интуитивно.
Теперь считается, что -inf < x < inf True для любого действительного числа x и всех
остальных случаев не выполняется.
assert_array_ и маскированные массивы assert_equal скрыть меньше предупреждений#
Некоторые предупреждения, которые ранее скрывались assert_array_
функции больше не скрыты. В большинстве случаев предупреждения должны быть корректными и, если они возникают, потребуют изменений в тестах, использующих эти функции. Для маскированного массива assert_equal версии, могут возникать предупреждения при
сравнении NaT. В настоящее время функция не обрабатывает NaT или NaN
специально, и, возможно, лучше избегать её использования в данный момент, если появится
предупреждение из-за этого изменения.
offset значение атрибута в memmap объекты#
The offset атрибут в memmap объект теперь установлен на смещение в файле. Это изменение поведения только для смещений больше mmap.ALLOCATIONGRANULARITY.
np.real и np.imag возвращать скаляры для скалярных входных данных#
Ранее, np.real и np.imag использовался для возврата объектов массива при предоставлении скалярного ввода, что было несовместимо с другими функциями, такими как
np.angle и np.conj.
Классы удобства для полиномов не могут передаваться в ufuncs#
Класс ABCPolyBase, от которого производятся удобные классы, устанавливает
__array_ufun__ = None чтобы отказаться от ufuncs. Если экземпляр класса-обёртки полинома передается как аргумент в ufunc, TypeError
теперь будет вызываться.
Выходные аргументы для ufuncs также могут быть кортежами для методов ufunc#
Для вызовов ufuncs это уже было возможно и рекомендовалось использовать
out аргумент с кортежем для ufuncs с несколькими выходами. Это было расширено для выходных аргументов в reduce, accumulate, и
reduceat методы. В основном для совместимости с __array_ufunc;
пока нет уфункций, которые имеют более одного вывода.