Примечания к выпуску NumPy 1.12.0#
Эта версия поддерживает Python 2.7 и 3.4 - 3.6.
Основные моменты#
Выпуск NumPy 1.12.0 содержит большое количество исправлений и улучшений, но немногие из них выделяются среди остальных. Это делает выбор основных моментов несколько произвольным, но следующие могут представлять особый интерес или указывать на области, которые, вероятно, будут иметь последствия в будущем.
Порядок операций в
np.einsumтеперь может быть оптимизирован для значительного ускорения.Новый
signatureаргумент дляnp.vectorizeдля векторизации с основными измерениями.The
keepdimsаргумент был добавлен ко многим функциям.Новый контекстный менеджер для тестирования предупреждений
Поддержка BLIS в numpy.distutils
Значительно улучшена поддержка PyPy (ещё не завершена)
Удалена поддержка#
Поддержка Python 2.6, 3.2 и 3.3 прекращена.
Добавлена поддержка#
Добавлена поддержка PyPy 2.7 v5.6.0. Хотя не полная (nditer
updateifcopyещё не поддерживается), это важный этап для слоя совместимости C-API PyPy.
Изменения в системе сборки#
Порядок библиотек сохраняется, вместо переупорядочивания для соответствия каталогам.
Устаревшие функции#
Присваивание объекта ndarray data атрибут#
Присвоение атрибута 'data' является по своей сути небезопасной операцией, как указано в gh-7083. Такая возможность будет удалена в будущем.
Небезопасное приведение int атрибута num в linspace#
np.linspace теперь вызывает DeprecationWarning, когда num не может быть безопасно
интерпретирован как целое число.
Недостаточная ширина битового параметра для binary_repr#
Если параметр 'width' передаётся в binary_repr которого недостаточно для представления числа в двоичной системе (положительное) или форме дополнения до двух (отрицательное), функция, используемая для тихого игнорирования параметра и возврата представления с минимальным количеством битов, необходимых для данной формы. Такое поведение теперь считается небезопасным с точки зрения пользователя и будет вызывать ошибку в будущем.
Будущие изменения#
В 1.13 NAT всегда будет сравниваться как False, за исключением
NAT != NAT, что будет True. Короче, NAT будет вести себя как NaNВ 1.13
np.averageбудет сохранять подклассы, чтобы соответствовать поведению большинства других функций numpy, таких как np.mean. В частности, это означает, что вызовы, которые возвращали скаляр, могут вместо этого возвращать 0-d объект подкласса.
Многополевая манипуляция структурированными массивами#
В версии 1.13 поведение структурированных массивов с несколькими полями изменится двумя способами:
Во-первых, индексация структурированного массива с несколькими полями (например,
arr[['f1', 'f3']]) вернет представление исходного массива в версии 1.13,
вместо копии. Обратите внимание, что возвращаемое представление будет иметь дополнительные байты заполнения,
соответствующие промежуточным полям в исходном массиве, в отличие от копии в
версии 1.12, что повлияет на код, такой как arr[['f1', 'f3']].view(newdtype).
Во-вторых, для версий numpy 1.6–1.12 присваивание между структурированными массивами происходит «по имени поля»: поля в целевом массиве устанавливаются в соответствующее поле в исходном массиве или в 0, если исходный массив не имеет такого поля:
>>> a = np.array([(1,2),(3,4)], dtype=[('x', 'i4'), ('y', 'i4')])
>>> b = np.ones(2, dtype=[('z', 'i4'), ('y', 'i4'), ('x', 'i4')])
>>> b[:] = a
>>> b
array([(0, 2, 1), (0, 4, 3)],
dtype=[('z', '
В версии 1.13 присваивание будет происходить "по позиции": N-е поле назначения будет установлено в N-е поле источника независимо от имени поля. Старое поведение можно получить, используя индексацию для переупорядочивания полей перед присваиванием, например, b[['x', 'y']] = a[['y', 'x']].
Примечания по совместимости#
DeprecationWarning в ошибку#
Индексирование с плавающей точкой вызывает
IndexError, например, a[0, 0.0].Индексирование с нецелочисленным array_like вызывает
IndexError, например,a['1', '2']Индексирование с несколькими многоточиями вызывает
IndexError, например,a[..., ...].Нецелые числа, используемые в качестве значений индекса, вызывают
TypeError, например, вreshape,take, и указание оси сокращения.
FutureWarning об изменении поведения#
np.fullтеперь возвращает массив типа fill-value, если тип не указан, вместо стандартного float.np.averageбудет выдавать предупреждение, если аргумент является подклассом ndarray, так как подкласс будет сохранен, начиная с версии 1.13. (см. Future Changes)
power и ** вызывать ошибки для целых чисел в отрицательных целых степенях#
Предыдущее поведение зависело от того, были ли задействованы скалярные целые числа numpy или целочисленные массивы numpy.
Для массивов
Ноль в отрицательных целых степенях возвращал наименьшее целое значение.
Оба 1, -1 в отрицательных целых степенях возвращали правильные значения.
Оставшиеся целые числа возвращали ноль при возведении в отрицательные целые степени.
Для скаляров
Ноль в отрицательных целых степенях возвращал наименьшее целое значение.
Оба 1, -1 в отрицательных целых степенях возвращали правильные значения.
Оставшиеся целые числа иногда возвращали ноль, иногда правильное значение с плавающей точкой в зависимости от комбинации типов целых чисел.
Все эти случаи теперь вызывают ValueError за исключением тех целочисленных
комбинаций, общий тип которых является float, например, uint64 и int8. Было
решено, что простое правило — лучший путь, чем создание специальных
исключений для целочисленных единиц. Если вам нужны отрицательные степени, используйте неточный
тип.
Проверка расслабленного шага является стандартной#
Это окажет некоторое влияние на код, который предполагал, что F_CONTIGUOUS и
C_CONTIGUOUS были взаимоисключающими и могли быть установлены для определения порядка по умолчанию для массивов, которые теперь являются обоими.
The np.percentile Метод интерполяции 'midpoint' исправлен для точных индексов#
Интерполятор 'midpoint' теперь даёт тот же результат, что и 'lower' и 'higher', когда они совпадают. Исправлено предыдущее поведение 'lower' + 0.5.
keepdims kwarg передается в методы пользовательского класса#
функции numpy, которые принимают keepdims kwarg теперь передает значение
в соответствующие методы подклассов ndarray. Ранее
keepdims ключевое слово будет молча игнорироваться. Эти функции теперь имеют
следующее поведение:
Если пользователь не предоставляет
keepdims, ключевое слово не передаётся в базовый метод.Любое пользовательское значение
keepdimsпередаётся как ключевой аргумент в метод.
Это вызовет исключение в случае, когда метод не поддерживает
keepdims kwarg и пользователь явно передаёт keepdims.
Следующие функции изменены: sum, product,
sometrue, alltrue, any, all, amax, amin,
prod, mean, std, var, nanmin, nanmax,
nansum, nanprod, nanmean, nanmedian, nanvar,
nanstd
bitwise_and идентичность изменена#
Предыдущее значение идентичности было 1, теперь оно -1. Подробности см. в разделе "Улучшения".
ma.median предупреждает и возвращает nan при обнаружении немасштабированных недопустимых значений#
Аналогично незамаскированной медиане, замаскированная медиана ma.median теперь выдаёт предупреждение Runtime и возвращает NaN в срезах, где немаркированный NaN присутствует.
Большая согласованность в assert_almost_equal#
Проверка точности для скаляров была изменена, чтобы соответствовать таковой для массивов. Теперь она:
abs(actual - desired) < 1.5 * 10**(-decimal)
Обратите внимание, что это менее строго, чем было ранее задокументировано, но согласуется с предыдущей реализацией, использовавшейся в assert_array_almost_equalНачнём с этого массива, названного "a"
NoseTester поведение предупреждений во время тестирования#
Когда raise_warnings="develop" указан, все неперехваченные предупреждения теперь будут считаться ошибкой теста. Ранее вызывались только выбранные. Предупреждения, которые не перехватываются или не вызываются (в основном в режиме релиза), будут показаны один раз во время цикла тестирования, аналогично настройкам Python по умолчанию.
assert_warns и deprecated декоратор более специфичный#
The assert_warns функция и контекстный менеджер теперь более специфичны
для данной категории предупреждений. Эта повышенная специфичность приводит к тому, что они
обрабатываются в соответствии с внешними настройками предупреждений. Это означает, что
предупреждение может не быть выдано в случаях, когда неправильная категория предупреждения задана
и проигнорирована вне контекста. Или повышенная специфичность
может означать, что предупреждения, которые были некорректно проигнорированы, теперь будут показаны
или выданы. См. также новый suppress_warnings менеджер контекста.
То же самое верно для deprecated декоратор.
C API#
Без изменений.
Новые возможности#
Именованный аргумент writeable для as_strided#
np.lib.stride_tricks.as_strided теперь имеет writeable
аргумент ключевого слова. Может быть установлен в False, когда не ожидается операция записи в возвращаемый массив, чтобы избежать случайных непредсказуемых записей.
axes именованный аргумент для rot90#
The axes именованный аргумент в rot90 определяет плоскость, в которой массив вращается. По умолчанию это axes=(0,1) как в исходной функции.
Обобщенный flip#
flipud и fliplr обращают элементы массива вдоль оси=0 и
оси=1 соответственно. Недавно добавленные flip функция переворачивает элементы
массива вдоль любой заданной оси.
np.count_nonzeroтеперь имеетaxisпараметр, позволяющий генерировать ненулевые значения не только для плоского массива.
Поддержка BLIS в numpy.distutils#
Сборка против реализации BLAS, предоставляемой библиотекой BLIS, теперь поддерживается. См. [blis] раздел в site.cfg.example (в корне репозитория или дистрибутива исходного кода numpy).
Хук в numpy/__init__.py для запуска специфичных для дистрибутива проверок#
Бинарные дистрибутивы numpy могут нуждаться в выполнении определённых аппаратных проверок или загрузке определённых библиотек во время инициализации numpy. Например, если мы распространяем numpy с библиотекой BLAS, требующей инструкций SSE2, мы хотели бы проверить, что машина, на которой запускается numpy, действительно имеет SSE2, чтобы выдать информативное сообщение об ошибке.
Добавить хук в numpy/__init__.py для импорта numpy/_distributor_init.py
файл, который останется пустым (кроме строки документации) в стандартном исходном коде numpy, но может быть перезаписан при создании бинарных дистрибутивов numpy.
Новые функции для работы с NaN nancumsum и nancumprod добавлен#
Функции для работы с NaN nancumsum и nancumprod были добавлены для вычисления cumsum и cumprod игнорируя значения NaN.
np.interp теперь может интерполировать комплексные значения#
np.lib.interp(x, xp, fp) теперь позволяет интерполированному массиву fp
будет комплексным и будет интерполировать в complex128 точность.
Новая функция вычисления полинома polyvalfromroots добавлен#
Новая функция polyvalfromroots вычисляет полином в заданных точках
по корням полинома. Это полезно для полиномов высокого порядка,
где разложение в коэффициенты полинома выполняется неточно на уровне
машинной точности.
Новая функция создания массива geomspace добавлен#
Новая функция geomspace генерирует геометрическую последовательность. Она похожа на logspace, но с явно указанными start и stop:
geomspace(start, stop) ведет себя так же, как
logspace(log10(start), log10(stop)).
Новый контекстный менеджер для тестирования предупреждений#
Новый контекстный менеджер suppress_warnings был добавлен в утилиты
тестирования. Этот контекстный менеджер предназначен для надежного тестирования предупреждений.
В частности, для надежной фильтрации/игнорирования предупреждений. Игнорирование предупреждений
с использованием фильтра "ignore" в версиях Python до 3.4.x может быстро
привести к тому, что эти (или подобные) предупреждения не будут надежно тестироваться.
Контекстный менеджер позволяет фильтровать (а также записывать) предупреждения аналогично catch_warnings контекст, но позволяет легче задавать специфичность.
Также печать предупреждений, которые не были отфильтрованы, или вложение
менеджера контекста будет работать как ожидалось. Кроме того, возможно
использовать менеджер контекста в качестве декоратора, что может быть полезно, когда
несколько тестов требуют скрытия одного и того же предупреждения.
Новые функции маскированных массивов ma.convolve и ma.correlate добавлен#
Эти функции оборачивали немасочные версии, но пропускают замаскированные значения. Существует два разных режима пропускания. По умолчанию замаскированные значения загрязняют результат масками, но другой режим выводит маски только если нет альтернативы.
Новый float_power универсальная функция (ufunc)#
Новый float_power ufunc похож на power функция, за исключением того, что все вычисления выполняются с минимальной точностью float64. Было долгое обсуждение в списке рассылки numpy о том, как обрабатывать целые числа в отрицательных целых степенях, и популярное предложение заключалось в том, что __pow__ оператор должен
всегда возвращать результаты с точностью не менее float64. Оператор float_power
функция реализует эту опцию. Обратите внимание, что она не поддерживает объектные массивы.
np.loadtxt теперь поддерживает одно целое число как usecol аргумент#
Вместо использования usecol=(n,) для чтения n-го столбца файла
теперь разрешено использовать usecol=n. Также сообщение об ошибке более понятно, когда нецелое число передаётся как индекс столбца.
Улучшенные автоматические оценки бинов для histogram#
Добавлены оценки 'doane' и 'sqrt' в histogram через bins
аргумент. Добавлена поддержка гистограмм с ограниченным диапазоном и автоматической
оценкой бинов.
np.roll теперь может вращать несколько осей одновременно#
The shift и axis аргументы для roll теперь транслируются друг относительно
друга, и каждая указанная ось сдвигается соответствующим образом.
The __complex__ метод был реализован для ndarrays#
Вызов complex() на массиве размера 1 теперь будет преобразовываться в python complex.
pathlib.Path теперь поддерживаются объекты#
Стандартное np.load, np.save, np.loadtxt, np.savez, и подобные
функции теперь могут принимать pathlib.Path объекты в качестве аргумента вместо
имени файла или открытого файлового объекта.
Новый bits атрибут для np.finfo#
Это делает np.finfo согласовано с np.iinfo который уже имеет этот
атрибут.
Новый signature аргумент для np.vectorize#
Этот аргумент позволяет векторизовать пользовательские функции с основными измерениями в стиле
обобщенные универсальные функции. Это позволяет
векторизовать гораздо более широкий класс функций. Например, произвольная
метрика расстояния, которая объединяет два вектора для получения скаляра, может быть
векторизована с signature='(n),(n)->()'. См. np.vectorize для полных подробностей.
Выдавать предупреждения py3kwarnings для деления целочисленных массивов#
Чтобы помочь людям мигрировать свои кодовые базы с Python 2 на Python 3, интерпретатор python имеет удобную опцию -3, которая выдает предупреждения во время выполнения. Одно из его предупреждений касается целочисленного деления:
$ python -3 -c "2/3"
-c:1: DeprecationWarning: classic int division
В Python 3 новые семантики целочисленного деления также применяются к массивам numpy. С этой версией numpy будет выдаваться аналогичное предупреждение:
$ python -3 -c "import numpy as np; np.array(2)/np.array(3)"
-c:1: DeprecationWarning: numpy: classic int division
numpy.sctypes теперь также включает bytes в Python3#
Ранее он включал str (bytes) и unicode в Python2, но только str (unicode) в Python3.
Улучшения#
bitwise_and идентичность изменена#
Предыдущее тождество было 1, в результате чего все биты, кроме младшего, маскировались при использовании метода reduce. Новое тождество -1, которое должно правильно работать на машинах с дополнительным кодом, так как все биты будут установлены в единицу.
Обобщенные универсальные функции теперь будут разблокировать GIL#
Обобщённые универсальные функции, включая большую часть модуля linalg, теперь будут разблокировать глобальную блокировку интерпретатора Python.
Кэши в np.fft теперь ограничены по общему размеру и количеству элементов#
Кэши в np.fft которые ускоряют последовательные БПФ одинаковой длины, больше не могут расти без ограничений. Они были заменены кэшами LRU (наименее недавно использованные), которые автоматически удаляют ненужные элементы, если достигнут предел размера памяти или количества элементов.
Улучшенная обработка строковых/юникодных dtype нулевой ширины#
Исправлены несколько интерфейсов, которые явно запрещали массивы с типами строк нулевой ширины (т.е. dtype('S0') или dtype('U0'), и исправлено несколько
ошибок, где такие типы данных не обрабатывались должным образом. В частности, изменено
ndarray.__new__ неявно не преобразовывать dtype('S0') to
dtype('S1') (и аналогично для unicode) при создании новых массивов.
Целочисленные ufuncs векторизованы с AVX2#
Если процессор поддерживает это во время выполнения, базовые целочисленные ufunc теперь используют инструкции AVX2. Эта функция в настоящее время доступна только при компиляции с GCC.
Оптимизация порядка операций в np.einsum#
np.einsum теперь поддерживает optimize аргумент, который оптимизирует порядок свертки. Например, np.einsum завершит пример цепочки скалярных произведений np.einsum(‘ij,jk,kl->il’, a, b, c) за один проход, который масштабируется как N^4; однако, когда optimize=True np.einsum создаст промежуточный массив для уменьшения этого масштабирования до N^3 или фактически
np.dot(a, b).dot(c). Использование промежуточных тензоров для уменьшения масштабирования
было применено к общей нотации суммирования einsum. См. np.einsum_path
для получения дополнительной информации.
quicksort был заменен на introsort#
Вид быстрой сортировки np.sort и np.argsort теперь является интроспективной сортировкой, которая представляет собой обычную быструю сортировку, но переключается на пирамидальную сортировку при недостаточном прогрессе. Это сохраняет хорошую производительность быстрой сортировки, изменяя наихудшее время выполнения с O(N^2) to O(N*log(N)).
ediff1d улучшенная производительность и обработка подклассов#
Функция ediff1d использует массив вместо плоского итератора для вычитания. Когда to_begin или to_end не None, вычитание выполняется на месте, чтобы исключить операцию копирования. Побочным эффектом является то, что некоторые подклассы обрабатываются лучше, а именно astropy.Quantity, поскольку полный массив создается, оборачивается, а затем устанавливаются начальное и конечное значения, вместо использования concatenate.
Улучшенная точность ndarray.mean для массивов float16#
Вычисление среднего для массивов float16 теперь выполняется в float32 для улучшенной точности. Это должно быть полезно в пакетах, таких как Theano, где точности float16 достаточно, а его меньший размер желателен.
Изменения#
Все методы, подобные массивам, теперь вызываются с именованными аргументами в fromnumeric.py#
Внутренне многие методы, работающие с массивами в fromnumeric.py, вызывались с позиционными аргументами вместо ключевых, как это делалось в их внешних сигнатурах. Это вызвало осложнение в библиотеке 'pandas', которая столкнулась с проблемой совместимости с 'numpy'. Теперь все методы, работающие с массивами в этом модуле, вызываются с ключевыми аргументами.
Операции с объектами np.memmap в большинстве случаев возвращают массивы numpy#
Ранее операции над объектом memmap вводили в заблуждение, возвращая экземпляр memmap,
даже если результат фактически не был отображён в память. Например,
arr + 1 или arr + arr возвращал бы экземпляры memmap, хотя память выходного массива не является memmapped. Версия 1.12 возвращает обычные массивы numpy из этих операций.
Кроме того, уменьшение размера memmap (например, .sum(axis=None) теперь возвращает скаляр numpy вместо 0d memmap.
уровень стека предупреждений увеличен#
Уровень стека для предупреждений на основе python был увеличен, чтобы большинство предупреждений сообщали о проблемной строке пользовательского кода, а не о строке, в которой выдаётся само предупреждение. Передача stacklevel теперь тестируется, чтобы гарантировать, что новые предупреждения будут получать stacklevel аргумент.
Это приводит к тому, что предупреждения с фильтром "default" или "module" показываются один раз для каждой проблемной строки пользовательского кода или пользовательского модуля, а не только один раз. На версиях python до 3.4 это может привести к появлению предупреждений, которые ранее были ложно проигнорированы, что может быть удивительно, особенно в тестовых наборах.