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

Эта версия поддерживает Python 2.7 и 3.4 - 3.6.

Основные моменты#

  • Операции, такие как a + b + c будет повторно использовать временные переменные на некоторых платформах, что приводит к меньшему использованию памяти и более быстрому выполнению.

  • Операции на месте проверяют, перекрываются ли входные данные с выходными, и создают временные объекты, чтобы избежать проблем.

  • Новый __array_ufunc__ атрибут предоставляет улучшенную возможность для классов переопределять поведение универсальных функций по умолчанию.

  • Новый np.block функция для создания блокированных массивов.

Новые функции#

  • Новый np.positive универсальная функция.

  • Новый np.divmod ufunc предоставляет более эффективный divmod.

  • Новый np.isnat ufunc тесты для специальных значений NaT.

  • Новый np.heaviside ufunc вычисляет функцию Хевисайда.

  • Новый 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 равен NULL

  • negative(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 теперь может принимать:

  1. Одиночный скаляр для указания расстояния выборки для всех размерностей.

  2. N скаляров для указания постоянного расстояния выборки для каждого измерения. Т.е. dx, dy, dz, …

  3. N массивов для указания координат значений вдоль каждого измерения F. Длина массива должна соответствовать размеру соответствующего измерения

  4. Любая комбинация 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; пока нет уфункций, которые имеют более одного вывода.