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

Этот выпуск поддерживает Python 2.6 - 2.7 и 3.2 - 3.4.

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

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

  • Добавление nanmedian и nanpercentile завершает набор nanfunction.

Удалена поддержка#

  • Модули oldnumeric и numarray были удалены.

  • Директории doc/pyrex и doc/cython были удалены.

  • Каталог doc/numpybook был удалён.

  • Файл numpy/testing/numpytest.py был удалён вместе с функцией importall, которую он содержал.

Будущие изменения#

  • Файл numpy/polynomial/polytemplate.py будет удалён в NumPy 1.10.0.

  • Стандартное приведение типов для операций на месте изменится на 'same_kind' в Numpy 1.10.0. Это определенно сломает некоторый код, который в настоящее время игнорирует предупреждение.

  • Ослабленная проверка шага будет использоваться по умолчанию в версии 1.10.0

  • Проверки версий строк будут ломаться, потому что, например, '1.9' > '1.10' — это True. Был добавлен класс NumpyVersion, который можно использовать для таких сравнений.

  • Функции diagonal и diag будут возвращать доступные для записи представления в версии 1.10.0

  • The S и/или a dtypes могут быть изменены для представления строк Python вместо байтов; в Python 3 эти два типа сильно различаются.

Примечания по совместимости#

Функции diagonal и diag возвращают представления только для чтения.#

В NumPy 1.8 функции diagonal и diag возвращали копии только для чтения, в NumPy 1.9 они возвращают представления только для чтения, а в 1.10 будут возвращать записываемые представления.

Специальные скалярные значения float больше не вызывают повышение до double#

В предыдущих версиях NumPy операции с плавающими скалярами, содержащими специальные значения NaN, Inf и -Inf привело к тому, что тип результата стал как минимум float64. Поскольку специальные значения могут быть представлены в наименьшем доступном типе с плавающей запятой, приведение к более высокому типу больше не выполняется.

Например, тип данных:

np.array([1.], dtype=np.float32) * float('nan')

теперь остается float32 вместо приведения к float64. Операции с неспециальными значениями не были изменены.

Изменения вывода процентилей#

Если задано более одного процентиля для вычисления, numpy.percentile возвращает массив вместо списка. Один процентиль по-прежнему возвращает скаляр. Массив эквивалентен преобразованию списка, возвращаемого в старых версиях, в массив через np.array.

Если overwrite_input если используется опция, ввод сортируется только частично вместо полной сортировки.

тип исключения ndarray.tofile#

Все tofile исключения теперь IOError, некоторые ранее были ValueError.

Исключения недопустимого значения заполнения#

Два изменения в numpy.ma.core._check_fill_value:

  • Когда значение заполнения является строкой, а тип массива не один из 'OSUV', вместо использования значения заполнения по умолчанию возникает TypeError.

  • Когда значение заполнения переполняет тип массива, вместо OverflowError вызывается TypeError.

Классы Polynomial больше не наследуются от PolyBase#

Это может вызвать проблемы у тех, кто зависел от того, что классы полиномов были производными от PolyBase. Теперь все они являются производными от абстрактного базового класса ABCPolyBase. Строго говоря, должно быть устаревание, но не было найдено внешнего кода, использующего старый базовый класс.

Использование numpy.random.binomial может изменить состояние ГСЧ по сравнению с numpy < 1.9#

Исправлена ошибка в одном из алгоритмов генерации биномиальной случайной величины. Это изменение, вероятно, изменит количество случайных выборок, выполняемых, и, следовательно, последовательность будет отличаться после вызова distribution.c::rk_binomial_btpe. Любые тесты, которые полагаются на известное состояние ГСЧ, должны быть проверены и/или обновлены в результате.

Случайное начальное значение принудительно устанавливается как 32-битное целое число без знака#

np.random.seed и np.random.RandomState теперь бросьте ValueError если начальное значение не может быть безопасно преобразовано в 32-битные целые числа без знака. Приложения, которые сейчас завершаются с ошибкой, можно исправить, обнулив старшие 32 бита: seed = seed & 0xFFFFFFFF. Это делается автоматически в старых версиях, чтобы сохранить одинаковый поток случайных чисел.

Аргумент out для argmin и argmax#

The out аргумент для np.argmin и np.argmax и их эквивалентные функции C-API теперь проверяются на точное соответствие желаемой выходной форме. Если проверка не пройдена, возникает ValueError вместо TypeError вызывается.

Einsum#

Убрать ненужные ограничения нотации вещания. np.einsum('ijk,j->ijk', A, B) также может быть записано как np.einsum('ij...,j->ij...', A, B) (многоточие больше не требуется на 'j')

Индексирование#

Индексирование NumPy было полностью переписано в этой версии. Это делает большинство сложных операций целочисленного индексирования намного быстрее и не должно иметь других последствий. Однако в сложных операциях индексирования были введены некоторые тонкие изменения и устаревания:

  • Булева индексация в скалярных массивах всегда возвращает новый 1-мерный массив. Это означает, что array(1)[array(True)] дает array([1]) а не исходный массив.

  • Расширенная индексация в одномерные массивы ранее имела (недокументированную) специальную обработку относительно повторения массива значений в присваиваниях, когда форма массива значений была слишком мала или не совпадала. Код, использующий это, вызовет ошибку. Для совместимости вы можете использовать arr.flat[index] = values, который использует старую ветку кода. (например a = np.ones(10); a[np.arange(10)] = [1, 2, 3])

  • Порядок итерации по расширенным индексам раньше всегда был C-порядком. В NumPy 1.9 порядок итерации адаптируется к входным данным и не гарантируется (за исключением одиночный расширенный индекс, который никогда не переворачивается по причинам совместимости). Это означает, что результат не определён, если одному элементу присваивается несколько значений. Пример этого: arr[[0, 0], [1, 1]] = [1, 2], который может установить arr[0, 1] либо 1, либо 2.

  • Эквивалентно порядку итерации, расположение в памяти результата расширенной индексации адаптировано для более быстрой индексации и не может быть предсказано.

  • Все операции индексирования возвращают представление или копию. Ни одна операция индексирования не вернет исходный объект массива. (Например arr[...])

  • В будущем булевы массиво-подобные объекты (например, списки булевых значений Python) всегда будут обрабатываться как булевы индексы, а булевы скаляры (включая python True) будет допустимым логический индекс. В настоящее время это уже так для скалярных массивов, чтобы разрешить общий positive = a[a > 0] чтобы работало, когда a имеет нулевую размерность.

  • В NumPy 1.8 можно было использовать array(True) и array(False) эквивалентно 1 и 0, если результат операции был скаляром. Это вызовет ошибку в NumPy 1.9 и, как отмечено выше, будет рассматриваться как булев индекс в будущем.

  • Все нецелочисленные массиво-подобные объекты устарели, объектные массивы пользовательских целочисленных объектов могут потребовать явного приведения.

  • Отчёт об ошибках для расширенной индексации стал более информативным, однако тип ошибки изменился в некоторых случаях. (Ошибки трансляции массивов индексации теперь сообщаются как IndexError)

  • Индексирование с более чем одним многоточием (...) устарел.

Нецелочисленные индексы оси редукции устарели#

Нецелочисленные индексы оси для редукционных ufunc, таких как add.reduce или sum устарели.

promote_types и строковый dtype#

promote_types функция теперь возвращает корректную длину строки, когда задан целочисленный или вещественный тип данных в качестве одного аргумента и строковый тип данных в качестве другого аргумента. Ранее она всегда возвращала входной строковый тип данных, даже если он не был достаточно длинным для хранения максимального целого/вещественного значения, преобразованного в строку.

can_cast и строковый dtype#

can_cast функция теперь возвращает False в режиме «безопасного» приведения для целочисленного/плавающего типа данных и строкового типа данных, если длина строкового типа данных недостаточна для хранения максимального целочисленного/плавающего значения, преобразованного в строку. Ранее can_cast в "безопасном" режиме возвращал True для целочисленного/вещественного dtype и строкового dtype любой длины.

astype и строковый dtype#

The astype Метод теперь возвращает ошибку, если строковый dtype, в который выполняется приведение, недостаточно длинный в «безопасном» режиме приведения, чтобы вместить максимальное значение целочисленного/вещественного массива, который приводится. Ранее приведение разрешалось, даже если результат усекался.

npyio.recfromcsv именованные аргументы изменяют#

npyio.recfromcsv больше не принимает недокументированный update ключевое слово, которое раньше переопределяло dtype ключевое слово.

The doc/swig директория перемещена#

The doc/swig директория была перемещена в tools/swig.

The npy_3kcompat.h заголовок изменен#

Неиспользуемый simple_capsule_dtor функция была удалена из npy_3kcompat.hПримечание: этот заголовок не предназначен для использования вне numpy; другие проекты должны использовать собственную копию этого файла при необходимости.

Отрицательные индексы в C-Api sq_item и sq_ass_item методы последовательностей#

При прямом доступе к sq_item или sq_ass_item Слоты PyObject для получения элементов, отрицательные индексы больше не будут поддерживаться. PySequence_GetItem и PySequence_SetItem однако исправляет отрицательные индексы, чтобы их можно было использовать там.

NDIter#

Когда NpyIter_RemoveAxis теперь вызывается, диапазон итератора будет сброшен.

Когда отслеживается мультииндекс и итератор не буферизован, можно использовать NpyIter_RemoveAxis. В этом случае итератор может уменьшиться в размере. Поскольку общий размер итератора ограничен, итератор может быть слишком большим до этих вызовов. В этом случае его размер будет установлен в -1 и ошибка выдается не во время создания, а при удалении мультииндекса, установке диапазона итератора или получении следующей функции.

Это не влияет на код, который работает в настоящее время, но подчеркивает необходимость проверки на возврат ошибки, если эти условия могут возникнуть. В большинстве случаев массивы, по которым выполняется итерация, такие же большие, как итератор, так что такая проблема не может возникнуть.

Это изменение уже было применено к релизу 1.8.1.

zeros_like для строковых dtypes теперь возвращает пустые строки#

Чтобы соответствовать zeros функция zeros_like теперь возвращает массив, инициализированный пустыми строками вместо массива, заполненного ‘0’.

Новые возможности#

Percentile поддерживает больше вариантов интерполяции#

np.percentile теперь имеет аргумент ключевого слова interpolation для указания, каким образом точки должны интерполироваться, если процентили попадают между двумя значениями. См. документацию для доступных опций.

Обобщённая поддержка осей для медианы и процентиля#

np.median и np.percentile теперь поддерживают обобщённые аргументы axis, как это делают ufunc редукции, начиная с версии 1.7. Теперь можно указать axis=(index, index) для выбора списка осей для редукции. keepdims ключевой аргумент также был добавлен для удобного вещания на массивы исходной формы.

Параметр Dtype добавлен в np.linspace и np.logspace#

Возвращаемый тип данных из linspace и logspace функции теперь могут быть указаны с использованием параметра dtype.

Более общий np.triu и np.tril вещание#

Для массивов с ndim превышающих 2, эти функции теперь будут применяться к последним двум осям вместо вызова исключения.

tobytes псевдоним для tostring метод#

ndarray.tobytes и MaskedArray.tobytes были добавлены как псевдонимы для tostring который экспортирует массивы как bytes. Это более согласованно в Python 3, где str и bytes не совпадают.

Система сборки#

Добавлена экспериментальная поддержка архитектур ppc64le и OpenRISC.

Совместимость с Python numbers модуль#

Все числовые типы numpy теперь зарегистрированы в иерархии типов в Python. numbers модуль.

increasing параметр добавлен в np.vander#

Порядок столбцов матрицы Вандермонда может быть указан с помощью этого нового логического аргумента.

unique_counts параметр добавлен в np.unique#

Количество появлений каждого уникального элемента во входных данных теперь можно получить как дополнительное возвращаемое значение.

Поддержка медианы и процентиля в nanfunctions#

The np.nanmedian и np.nanpercentile функции ведут себя как функции медианы и процентиля, за исключением того, что NaN игнорируются.

Добавлен класс NumpyVersion#

Класс может быть импортирован из numpy.lib и использоваться для сравнения версий, когда версия numpy переходит к 1.10.devel. Например:

>>> from numpy.lib import NumpyVersion
>>> if NumpyVersion(np.__version__) < '1.10.0'):
...     print('Wow, that is an old NumPy version!')

Разрешить сохранение массивов с большим количеством именованных столбцов#

Формат хранения numpy 1.0 позволял заголовку массива иметь общий размер не более 65535 байт. Это может быть превышено структурированными массивами с большим количеством столбцов. Добавлен новый формат 2.0, который расширяет размер заголовка до 4 ГиБ. np.save будет автоматически сохранять в формате 2.0, если данные требуют этого, иначе всегда будет использовать более совместимый формат 1.0.

Полная поддержка широковещания для np.cross#

np.cross теперь правильно транслирует два входных массива, даже если они имеют разное количество измерений. В более ранних версиях это приводило либо к возникновению ошибки, либо к вычислению неверных результатов.

Улучшения#

Лучшая численная стабильность для суммы в некоторых случаях#

Попарное суммирование теперь используется в методе sum, но только вдоль быстрой оси и для групп значений длиной <= 8192. Это также должно улучшить точность var и std в некоторых распространенных случаях.

Процентиль, реализованный в терминах np.partition#

np.percentile был реализован в терминах np.partition который лишь частично сортирует данные с помощью алгоритма выбора. Это улучшает временную сложность с O(nlog(n)) to O(n).

Улучшение производительности для np.array#

Производительность преобразования списков, содержащих массивы, в массивы с использованием np.array был улучшен. Теперь он эквивалентен по скорости np.vstack(list).

Улучшение производительности для np.searchsorted#

Для встроенных числовых типов, np.searchsorted больше не зависит от типа данных compare функция для выполнения поиска, но теперь реализована с помощью функций, специфичных для типа. В зависимости от размера входных данных это может привести к повышению производительности более чем в 2 раза.

Необязательное уменьшение подробности вывода для np.distutils#

Установить numpy.distutils.system_info.system_info.verbosity = 0 и затем вызовы numpy.distutils.system_info.get_info('blas_opt') не будет выводить ничего на выход. Это в основном для других пакетов, использующих numpy.distutils.

isfinite np.random.multivariate_normal#

A RuntimeWarning предупреждение выводится, когда ковариационная матрица не является положительно-полуопределённой.

Классы Polynomial больше не основаны на шаблонах#

Полиномиальные классы были переработаны для использования абстрактного базового класса вместо шаблона, чтобы реализовать общий интерфейс. Это ускоряет импорт полиномиального пакета, так как классы не нужно компилировать при импорте.

Больше освобождений GIL#

Несколько дополнительных функций теперь освобождают Global Interpreter Lock, позволяя более эффективную параллелизацию с использованием threading модуль. В частности, GIL теперь освобождается для расширенного индексирования, np.where и random модуль теперь использует блокировку на уровне состояния вместо GIL.

Поддержка MaskedArray для более сложных базовых классов#

Встроенные предположения, что базовый класс ведёт себя как обычный массив, удаляются. В частности, repr и str теперь должен работать более надежно.

C-API#

Устаревшие функции#

Нецелочисленные скаляры для повторения последовательности#

Использование нецелых скаляров numpy для повторения последовательностей python устарело. Например np.float_(2) * [1] будет ошибкой в будущем.

select устаревания входных данных#

Целочисленный и пустой вход в select устарел. В будущем только булевы массивы будут допустимыми условиями, и пустой condlist будет считаться ошибкой ввода вместо возврата значения по умолчанию.

rank функция#

The rank функция была устаревшей, чтобы избежать путаницы с numpy.linalg.matrix_rank.

Сравнения равенства массивов объектов#

В будущем сравнения массивов объектов будут == и np.equal больше не будет использовать проверки идентичности. Например:

>>> a = np.array([np.array([1, 2, 3]), 1])
>>> b = np.array([np.array([1, 2, 3]), 1])
>>> a == b

будет последовательно возвращать False (а в будущем ошибку), даже если массив в a и b был тем же объектом.

Оператор равенства == в будущем будет вызывать ошибки, такие как np.equal если вещание или поэлементные сравнения и т.д. завершаются неудачей.

Сравнение с arr == None в будущем будет выполнять поэлементное сравнение вместо простого возврата False. Код должен использовать arr равен None.

Все эти изменения будут вызывать предупреждения Deprecation или FutureWarnings в настоящее время.

C-API#

Утилитные функции npy_PyFile_Dup и npy_PyFile_DupClose сломаны из-за внутренней буферизации, которую python 3 применяет к своим файловым объектам. Чтобы исправить это, в npy_3kcompat.h объявлены две новые функции npy_PyFile_Dup2 и npy_PyFile_DupClose2, а старые функции устарели. Из-за хрупкой природы этих функций рекомендуется по возможности использовать API python.

Это изменение уже было применено к релизу 1.8.1.