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

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

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

  • Новый, без 2to3, Python 2 и Python 3 поддерживаются общей кодовой базой.

  • Новые универсальные функции для линейной алгебры, позволяющие операции над сложенными массивами.

  • Новое, на месте индексирование для ufunc с .at метод.

  • Новый, partition функция, частичная сортировка через выбор для быстрого медианного значения.

  • Новый, nanmean, nanvar, и nanstd функции, пропускающие NaN.

  • Новый, full и full_like функции для создания массивов с инициализированными значениями.

  • Новый, PyUFunc_RegisterLoopForDescr, улучшенная поддержка ufunc для пользовательских типов данных.

  • Многочисленные улучшения производительности во многих областях.

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

Поддержка версий Python 2.4 и 2.5 прекращена,

Поддержка SCons была удалена.

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

Тип Datetime64 остается экспериментальным в этом выпуске. В версии 1.9, вероятно, будут внесены некоторые изменения, чтобы сделать его более удобным.

Метод diagonal в настоящее время возвращает новый массив и вызывает FutureWarning. В версии 1.9 он будет возвращать представление только для чтения.

Множественный выбор полей из массива структурированного типа в настоящее время возвращает новый массив и вызывает FutureWarning. В версии 1.9 он будет возвращать только для чтения представление.

Модули совместимости numpy/oldnumeric и numpy/numarray будут удалены в версии 1.9.

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

Содержимое doc/sphinxext было перемещено в собственный репозиторий GitHub и включено в numpy как подмодуль. См. инструкции в doc/HOWTO_BUILD_DOCS.rst для доступа к содержимому.

Хеш-функция скаляров numpy.void была изменена. Ранее указатель на данные хешировался как целое число. Теперь хеш-функция использует алгоритм хеширования кортежей для объединения хеш-функций элементов скаляра, но только если скаляр доступен только для чтения.

NumPy переключил свою систему сборки на использование «раздельной компиляции» по умолчанию. В предыдущих релизах это поддерживалось, но не было по умолчанию. Это должно давать те же результаты, что и старая система, но если вы пытаетесь сделать что-то сложное, например, статически слинковать NumPy или использовать необычный компилятор, то возможно, вы столкнётесь с проблемами. Если так, пожалуйста, сообщите об ошибке, и в качестве временного решения вы можете повторно включить старую систему сборки, экспортировав переменную окружения NPY_SEPARATE_COMPILATION=0.

Для итератора AdvancedNew oa_ndim флаг теперь должен быть -1, чтобы указать, что нет op_axes и itershape передаются. В oa_ndim == 0 случай, теперь указывает на 0-D итерацию и op_axes быть NULL, и старое использование устарело. Это не влияет на NpyIter_New или NpyIter_MultiNew функций.

Функции nanargmin и nanargmax теперь возвращают np.iinfo['intp'].min для индекса в срезах, состоящих полностью из NaN. Ранее функции вызывали ValueError для возвратов массива и NaN для скалярных возвратов.

NPY_RELAXED_STRIDES_CHECKING#

Существует новая переменная окружения времени компиляции NPY_RELAXED_STRIDES_CHECKING. Если эта переменная установлена в 1, то numpy будет считать больше массивов C- или F-непрерывными — например, становится возможным иметь вектор-столбец, который считается одновременно C- и F-непрерывным. Новое определение более точное, позволяет выполнять код быстрее с меньшим количеством ненужных копий и упрощает внутренний код numpy. Однако это также может нарушить работу сторонних библиотек, которые делают слишком строгие предположения о значениях шага C- и F-непрерывных массивов. (Также в настоящее время известно, что это нарушает код Cython с использованием memoryviews, что будет исправлено в Cython.) ЭТО СТАНЕТ ПО УМОЛЧАНИЮ В БУДУЩЕМ ВЫПУСКЕ, ПОЭТОМУ ПРОТЕСТИРУЙТЕ СВОЙ КОД СЕЙЧАС С NUMPY, СОБРАННЫМ С:

NPY_RELAXED_STRIDES_CHECKING=1 python setup.py install

Вы можете проверить, действует ли NPY_RELAXED_STRIDES_CHECKING, запустив:

np.ones((10, 1), order="C").flags.f_contiguous

Это будет True если включена проверка расслабленных шагов, и False в противном случае. Типичная проблема, которую мы видели до сих пор, — это код на C, который работает с C-непрерывными массивами и предполагает, что размер элемента можно получить, посмотрев на последний элемент в PyArray_STRIDES(arr) массив. Когда действуют ослабленные шаги, это неверно (и на самом деле, это никогда не было верным в некоторых крайних случаях). Вместо этого используйте PyArray_ITEMSIZE(arr).

Для получения дополнительной информации см. раздел «Внутренняя структура памяти ndarray» в документации.

Бинарные операции с не-массивами в качестве второго аргумента#

Бинарные операции вида * где объявляет __array_priority__ выше, чем у теперь будет безусловно возвращать NotImplemented, что дает возможность обработать операцию. Ранее, NotImplemented будет возвращён только если фактически реализовал обратную операцию, и после (потенциально затратного) преобразования массива была предпринята попытка. (ошибка, запрос на слияние)

Функция медиана используется с overwrite_input частично сортирует массив#

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

Исправление financial.npv#

Функция npv имела ошибку. Вопреки тому, что было указано в документации, она суммировала с индексов 1 to M вместо из 0 to M - 1. Исправление изменяет возвращаемое значение. Функция mirr вызывала функцию npv, но обходила проблему, поэтому это также было исправлено, и возвращаемое значение функции mirr осталось неизменным.

Предупреждения времени выполнения при сравнении чисел NaN#

Сравнение NaN числа с плавающей точкой теперь вызывают invalid предупреждение времени выполнения. Если NaN ожидается, предупреждение можно игнорировать с помощью np.errstate. Например:

with np.errstate(invalid='ignore'):
    operation()

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

Поддержка линейной алгебры для стековых массивов#

Механизм gufunc теперь используется для np.linalg, позволяя операции над стекированными массивами и векторами. Например:

>>> a
array([[[ 1.,  1.],
        [ 0.,  1.]],

       [[ 1.,  1.],
        [ 0.,  1.]]])

>>> np.linalg.inv(a)
array([[[ 1., -1.],
        [ 0.,  1.]],

       [[ 1., -1.],
        [ 0.,  1.]]])

Индексное присваивание с использованием массивов для универсальных функций#

Функция at был добавлен к объектам ufunc для разрешения ufunc на месте без буферизации при использовании сложной индексации. Например, следующее увеличит первый и второй элементы в массиве и увеличит третий элемент дважды: numpy.add.at(arr, [0, 1, 2, 2], 1)

Это то, что многие ошибочно думали arr[[0, 1, 2, 2]] += 1 сделал бы, но это не работает, так как увеличенное значение arr[2] просто копируется в третий слот в arr дважды, а не увеличен дважды.

Новые функции раздел и argpartition#

Новые функции для частичной сортировки массивов с помощью алгоритма выбора.

A partition по индексу k перемещает k наименьший элемент в начало массива. Все элементы перед k затем меньше или равны значению в позиции k и все последующие элементы k затем больше или равны значению в позиции k. Порядок значений в этих границах не определен. Может быть предоставлена последовательность индексов для сортировки всех из них в их отсортированные позиции за один проход итерационного разделения. Это может использоваться для эффективного получения порядковых статистик, таких как медиана или процентили выборок. partition имеет линейную временную сложность O(n) в то время как полная сортировка имеет O(n log(n)).

Новые функции nanmean, nanvar и nanstd#

Добавлены новые статистические функции, учитывающие nan. В этих функциях результаты такие, какие были бы получены, если бы значения nan были исключены из всех вычислений.

Новые функции полный и full_like#

Новые удобные функции для создания массивов, заполненных определенным значением; дополняют существующие zeros и zeros_like функций.

Совместимость ввода-вывода с большими файлами#

Большие файлы NPZ >2 ГБ могут быть загружены на 64-битных системах.

Сборка с OpenBLAS#

Теперь можно собрать numpy с OpenBLAS, отредактировав site.cfg.

Новая константа#

Константа Эйлера теперь доступна в numpy как euler_gamma.

Новые режимы для qr#

Добавлены новые режимы 'complete', 'reduced' и 'raw' для QR-разложения, а старые режимы 'full' и 'economic' устарели. Режим 'reduced' заменяет старый режим 'full' и является режимом по умолчанию, как и режим 'full', поэтому обратная совместимость может быть сохранена путем не указания режима.

Режим 'complete' возвращает полное факторизованное представление, которое может быть полезно для получения базиса ортогонального дополнения пространства значений. Режим 'raw' возвращает массивы, содержащие отражения Хаусхолдера и масштабирующие коэффициенты, которые можно использовать в будущем для применения q без необходимости преобразования в матрицу. Режим 'economic' просто устарел, для него нет особого применения, и он не более эффективен, чем режим 'raw'.

Новый инвертировать аргумент для in1d#

Функция in1d теперь принимает инвертировать аргумент, который, когда True, приводит к инвертированию возвращаемого массива.

Расширенная индексация с использованием np.newaxis#

Теперь можно использовать np.newaxis/None вместе с индексными массивами вместо простых индексов. Это означает, что array[np.newaxis, [0, 1]] теперь будет работать как ожидается и выбирать первые две строки, добавляя новую ось к массиву.

C-API#

Теперь можно регистрировать новые универсальные функции со встроенными входными типами и пользовательским выходным типом. До этого изменения NumPy не мог найти правильную функцию цикла универсальной функции при вызове из Python, потому что логика сопоставления сигнатур цикла универсальной функции не учитывала тип выходного операнда. Теперь правильный цикл универсальной функции находится, если пользователь предоставляет выходной аргумент с правильным выходным типом.

runtests.py#

Простой скрипт для запуска тестов runtests.py был добавлен. Он также собирает Numpy через setup.py build и может использоваться для легкого запуска тестов во время разработки.

Улучшения#

Улучшения производительности ввода-вывода#

Производительность при чтении больших файлов улучшена за счет разбиения на блоки (см. также совместимость ввода-вывода).

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

The pad функция имеет новую реализацию, значительно улучшающую производительность для всех входных данных, кроме mode= (сохранено для обратной совместимости). Масштабирование с размерностью значительно улучшено для ранга >= 4.

Улучшения производительности для isnan, isinf, , в этом случае этот параметр равен 0, и это значение используется для и обмен байтами#

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

Улучшения производительности через векторизацию SSE2#

Несколько функций были оптимизированы для использования инструкций SSE2 CPU SIMD.

  • Float32 и float64:
    • базовая математика (добавить, вычитать, делить, умножить)

    • sqrt

    • minimum/maximum

    • absolute

  • Bool:
    • logical_or

    • logical_and

    • logical_not

Это улучшает производительность этих операций до 4x/2x для float32/float64 и до 10x для bool в зависимости от расположения данных в кэшах ЦП. Наибольший прирост производительности наблюдается для операций на месте.

Для использования улучшенных функций набор инструкций SSE2 должен быть включен во время компиляции. По умолчанию он включен в системах x86_64. На x86_32 с поддерживающим ЦП его необходимо включить, передав соответствующий флаг в переменную сборки CFLAGS (-msse2 в gcc).

Улучшения производительности для медиана#

медиана теперь реализован через раздел вместо sort что снижает его временную сложность с O(n log(n)) до O(n). Если используется с overwrite_input опция теперь будет только частично сортировать массив вместо полной сортировки.

Переопределяемые флаги операндов в ufunc C-API#

При создании ufunc флаги операндов по умолчанию могут быть переопределены через новый атрибут op_flags объекта ufunc. Например, чтобы установить флаг операнда для первого ввода в режим чтения/записи:

PyObject *ufunc = PyUFunc_FromFuncAndData(…); ufunc->op_flags[0] = NPY_ITER_READWRITE;

Это позволяет ufunc выполнять операцию на месте. Также глобальные флаги nditer могут быть переопределены через новый атрибут iter_flags объекта ufunc. Например, чтобы установить флаг reduce для ufunc:

ufunc->iter_flags = NPY_ITER_REDUCE_OK;

Изменения#

Общее#

Функция np.take теперь позволяет использовать 0-d массивы в качестве индексов.

Режим раздельной компиляции теперь включён по умолчанию.

Несколько изменений в np.insert и np.delete:

  • Ранее отрицательные индексы и индексы, указывающие за конец массива, просто игнорировались. Теперь это будет вызывать Future или Deprecation Warning. В будущем они будут обрабатываться так же, как обычное индексирование — отрицательные индексы будут оборачиваться, а индексы за пределами границ будут вызывать ошибку.

  • Ранее булевы индексы обрабатывались как целочисленные (всегда ссылаясь на 0-й или 1-й элемент массива). В будущем они будут обрабатываться как маски. В этом выпуске они вызывают FutureWarning, предупреждающий об этом предстоящем изменении.

  • В Numpy 1.7. np.insert уже позволял синтаксис np.insert(arr, 3, [1,2,3]) для вставки нескольких элементов в одну позицию. В Numpy 1.8. это также возможно для np.insert(arr, [3], [1, 2, 3]).

Заполненные области из np.pad теперь правильно округляются, а не обрезаются.

Дополнения к C-API для массивов#

В C-API массива добавлены четыре новые функции.

  • PyArray_Partition

  • PyArray_ArgPartition

  • PyArray_SelectkindConverter

  • PyDataMem_NEW_ZEROED

Дополнения C-API для универсальных функций#

В C-API ufunc добавлена одна новая функция, позволяющая зарегистрировать внутренний цикл для пользовательских типов с использованием descr.

  • PyUFunc_RegisterLoopForDescr

Улучшения для разработчиков C-API#

The PyArray_Type функция создания экземпляра tp_new теперь использует tp_basicsize чтобы определить, сколько памяти выделить. В предыдущих версиях только sizeof(PyArrayObject) было выделено байт памяти, что часто требует от подтипов C-API перереализации tp_new.

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

Режимы 'full' и 'economic' QR-разложения устарели.

Общее#

Использование нецелых чисел для индексов и большинства целочисленных аргументов устарело. Ранее вещественные индексы и аргументы функций, такие как axes или shapes, обрезались до целых чисел без предупреждения. Например arr.reshape(3., -1) или arr[0.] вызовет предупреждение об устаревании в NumPy 1.8., а в какой-то будущей версии NumPy они вызовут ошибку.

Авторы#

Этот выпуск содержит работу следующих людей, которые внесли хотя бы один патч в этот выпуск. Имена приведены в алфавитном порядке по имени:

  • 87

  • Адам Гинсбург +

  • Adam Griffiths +

  • Alexander Belopolsky +

  • Alex Barth +

  • Alex Ford +

  • Андреас Хилболл +

  • Андреас Клёкнер +

  • Andreas Schwab +

  • Эндрю Хортон +

  • argriffing +

  • Arink Verma +

  • Bago Amirbekian +

  • Bartosz Telenczuk +

  • bebert218 +

  • Benjamin Root +

  • Bill Spotz +

  • Bradley M. Froehle

  • Carwyn Pelley +

  • Чарльз Харрис

  • Chris

  • Christian Brueffer +

  • Christoph Dann +

  • Кристоф Голке

  • Дэн Хипшман +

  • Daniel +

  • Dan Miller +

  • daveydave400 +

  • David Cournapeau

  • David Warde-Farley

  • Денис Лаксальд

  • dmuellner +

  • Edward Catmur +

  • Егор Зинди +

  • endolith

  • Эрик Файринг

  • Eric Fode

  • Eric Moore +

  • Эрик Прайс +

  • Fazlul Shahriar +

  • Феликс Хартманн +

  • Фернандо Перес

  • Фрэнк Б +

  • Frank Breitling +

  • Фредерик

  • Габриэль

  • GaelVaroquaux

  • Гийом Гей +

  • Han Genuit

  • HaroldMills +

  • hklemm +

  • jamestwebber +

  • Jason Madden +

  • Jay Bourque

  • jeromekelleher +

  • Jesús Gómez +

  • jmozmoz +

  • jnothman +

  • Johannes Schönberger +

  • John Benediktsson +

  • John Salvatier +

  • John Stechschulte +

  • Jonathan Waltman +

  • Joon Ro +

  • Jos de Kloe +

  • Joseph Martinot-Lagarde +

  • Джош Уорнер (Mac) +

  • Jostein Bø Fløystad +

  • Juan Luis Cano Rodríguez +

  • Джулиан Тейлор +

  • Жюльен Фалип +

  • K.-Michael Aye +

  • Kumar Appaiah +

  • Lars Buitinck

  • Leon Weber +

  • Luis Pedro Coelho

  • Marcin Juszkiewicz

  • Mark Wiebe

  • Мартен ван Керквейк +

  • Martin Baeuml +

  • Martin Spacek

  • Мартин Тайхманн +

  • Matt Davis +

  • Мэтью Бретт

  • Maximilian Albert +

  • m-d-w +

  • Michael Droettboom

  • mwtoews +

  • Nathaniel J. Smith

  • Nicolas Scheffer +

  • Nils Werner +

  • ochoadavid +

  • Ondřej Čertík

  • ovillellas +

  • Пол Иванов

  • Pauli Virtanen

  • peterjc

  • Ralf Gommers

  • Raul Cota +

  • Ричард Хаттерсли +

  • Robert Costa +

  • Robert Kern

  • Rob Ruana +

  • Ronan Lamy

  • Sandro Tosi

  • Sascha Peilicke +

  • Себастьян Берг

  • Skipper Seabold

  • Stefan van der Walt

  • Steve +

  • Takafumi Arakaki +

  • Томас Робитай +

  • Tomas Tomecek +

  • Travis E. Oliphant

  • Валентин Хенель

  • Владимир Рутский +

  • Warren Weckesser

  • Yaroslav Halchenko

  • Юрий В. Зайцев +

Всего 119 человек внесли вклад в этот выпуск. Люди со знаком «+» рядом с именами внесли патч впервые.