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

Этот минорный выпуск включает многочисленные исправления ошибок, официальную поддержку python 2.6 и несколько новых функций, таких как обобщённые ufuncs.

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

Поддержка Python 2.6#

Python 2.6 теперь поддерживается на всех ранее поддерживаемых платформах, включая Windows.

https://www.python.org/dev/peps/pep-0361/

Обобщённые универсальные функции#

Существует общая необходимость в циклах не только для функций над скалярами, но и для функций над векторами (или массивами), как объяснено на http://scipy.org/scipy/numpy/wiki/GeneralLoopingFunctions. Мы предлагаем реализовать эту концепцию путём обобщения универсальных функций (ufuncs) и предоставить реализацию на C, которая добавляет ~500 строк к кодовой базе numpy. В текущих (специализированных) ufuncs элементарная функция ограничена поэлементными операциями, тогда как обобщённая версия поддерживает операции «под-массив» на «под-массив». Библиотека векторов Perl PDL предоставляет аналогичную функциональность, и её термины используются далее.

Каждая обобщенная универсальная функция имеет связанную с ней информацию, которая указывает, какова «основная» размерность входных данных, а также соответствующая размерность выходных данных (поэлементные универсальные функции имеют нулевую основную размерность). Список основных размерностей для всех аргументов называется «сигнатурой» универсальной функции. Например, универсальная функция numpy.add имеет сигнатуру «(),()->()», определяющую два скалярных входа и один скалярный выход.

Другой пример (см. страницу GeneralLoopingFunctions) — функция inner1d(a,b) с сигнатурой "(i),(i)->()". Она применяет скалярное произведение вдоль последней оси каждого входа, но сохраняет остальные индексы неизменными. Например, если a имеет форму (3,5,N), а b — (5,N), это вернёт результат формы (3,5). Базовая элементарная функция вызывается 3*5 раз. В сигнатуре мы указываем одно основное измерение "(i)" для каждого входа и ноль основных измерений "()" для выхода, так как она принимает два одномерных массива и возвращает скаляр. Используя то же имя "i", мы указываем, что два соответствующих измерения должны быть одного размера (или одно из них имеет размер 1 и будет транслироваться).

Измерения за пределами основных измерений называются «цикловыми» измерениями. В приведённом выше примере это соответствует (3,5).

Применяются обычные правила "трансляции" numpy, где сигнатура определяет, как размерности каждого входного/выходного объекта разделяются на основные и циклические размерности:

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

Экспериментальная поддержка Windows 64 бит#

NumPy теперь можно собрать на Windows 64-бит (только amd64, не IA64) как с компиляторами MS, так и с компиляторами mingw-w64:

Это очень экспериментальный: НЕ ИСПОЛЬЗУЙТЕ ДЛЯ ПРОИЗВОДСТВЕННОГО ИСПОЛЬЗОВАНИЯ. См. INSTALL.txt, раздел Windows 64 bits для получения дополнительной информации об ограничениях и о том, как собрать его самостоятельно.

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

Проблемы форматирования#

Форматирование чисел с плавающей точкой теперь обрабатывается numpy вместо среды выполнения C: это позволяет независимое от локали форматирование, более надёжные методы fromstring и связанные. Специальные значения (inf и nan) также более согласованы между платформами (nan против IND/NaN и т.д.), и более согласованы с недавней работой по форматированию в Python (в 2.6 и позже).

Обработка NaN в max/min#

Максимальные/минимальные ufunc теперь надежно распространяют nan. Если один из аргументов — nan, то возвращается nan. Это затрагивает np.min/np.max, amin/amax и методы массивов max/min. Новые ufunc fmax и fmin были добавлены для обработки непропагирующих nan.

Обработка NaN в sign#

Универсальная функция sign теперь возвращает nan для знака nan.

Новые ufuncs#

  1. fmax — то же, что и maximum для целочисленных типов и не-nan чисел с плавающей точкой. Возвращает не-nan аргумент, если один аргумент является nan, и возвращает nan, если оба аргумента являются nan.

  2. fmin — то же, что и minimum для целочисленных типов и не-NaN float. Возвращает не-NaN аргумент, если один аргумент — NaN, и возвращает NaN, если оба аргумента — NaN.

  3. deg2rad - преобразует градусы в радианы, аналогично ufunc radians.

  4. rad2deg - преобразует радианы в градусы, аналогично ufunc degrees.

  5. log2 - логарифм по основанию 2.

  6. exp2 - экспонента по основанию 2.

  7. trunc — усечение чисел с плавающей запятой до ближайшего целого в сторону нуля.

  8. logaddexp - складывает числа, хранящиеся как логарифмы, и возвращает логарифм результата.

  9. logaddexp2 — складывает числа, хранящиеся как логарифмы по основанию 2, и возвращает логарифм по основанию 2 результата.

Маскированные массивы#

Несколько новых функций и исправлений ошибок, включая:

  • структурированные массивы теперь должны полностью поддерживаться MaskedArray (r6463, r6324, r6305, r6300, r6294…)

  • Незначительные исправления ошибок (r6356, r6352, r6335, r6299, r6298)

  • Улучшенная поддержка __iter__ (r6326)

  • сделаны baseclass, sharedmask и hardmask доступными пользователю (но только для чтения)

  • обновление документации

поддержка gfortran на windows#

Gfortran теперь можно использовать как компилятор Fortran для numpy на Windows, даже когда C-компилятор — Visual Studio (VS 2005 и выше; VS 2003 НЕ будет работать). Gfortran + Visual Studio не работает на Windows 64 бит (но gcc + gfortran работает). Неясно, будет ли возможно использовать gfortran и Visual Studio вообще на x64.

Опция Arch для windows binary#

Автоматическое определение архитектуры теперь можно обойти из командной строки для установленного суперпакета:

numpy-1.3.0-superpack-win32.exe /arch=nosse

установит numpy, который работает на любом x86, даже если запущенный компьютер поддерживает набор SSE.

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

Гистограмма#

Семантика гистограммы была изменена для исправления давних проблем с обработкой выбросов. Основные изменения касаются

  1. определение границ бинов, теперь включая самую правую границу, и

  2. обработка верхних выбросов, теперь игнорируется, а не учитывается в крайнем правом бине.

Предыдущее поведение всё ещё доступно с использованием new=False, но это устарело и будет полностью удалено в версии 1.4.0.

Изменения в документации#

Было добавлено много документации. Как руководство пользователя, так и справочники могут быть построены из sphinx.

Новый C API#

Multiarray API#

В C API multiarray добавлены следующие функции:

  • PyArray_GetEndianness: для получения порядка байтов во время выполнения

API Ufunc#

В API ufunc были добавлены следующие функции:

  • PyUFunc_FromFuncAndDataAndSignature: для объявления более общей универсальной функции (обобщённой универсальной функции).

Новые определения#

Новые публичные C-определения доступны для ARCH-специфичного кода через numpy/npy_cpu.h:

  • NPY_CPU_X86: архитектура x86 (32 бита)

  • NPY_CPU_AMD64: архитектура amd64 (x86_64, НЕ Itanium)

  • NPY_CPU_PPC: 32 бита ppc

  • NPY_CPU_PPC64: 64-битный ppc

  • NPY_CPU_SPARC: 32-битный sparc

  • NPY_CPU_SPARC64: 64-битный sparc

  • NPY_CPU_S390: S390

  • NPY_CPU_IA64: ia64

  • NPY_CPU_PARISC: PARISC

Добавлены новые макросы для порядка байтов CPU (см. внутренние изменения ниже для подробностей):

  • NPY_BYTE_ORDER: целое число

  • определения NPY_LITTLE_ENDIAN/NPY_BIG_ENDIAN

Они предоставляют переносимые альтернативы макросам glibc endian.h для платформ без них.

Переносимые NAN, INFINITY и т.д.#

npy_math.h теперь предоставляет несколько переносимых макросов для получения NAN, INFINITY:

  • NPY_NAN: эквивалентно NAN, что является расширением GNU

  • NPY_INFINITY: эквивалентно C99 INFINITY

  • NPY_PZERO, NPY_NZERO: положительный и отрицательный ноль соответственно

Соответствующие макросы для одинарной и расширенной точности также доступны. Все ссылки на NAN или собственные вычисления NAN на лету были удалены для согласованности.

Внутренние изменения#

реорганизация математической конфигурации numpy.core#

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

https://www.numpy.org/neps/nep-0003-math_config_clean.html

рефакторинг umath#

Много очистки кода для umath/ufunc кода (charris).

Улучшения в предупреждениях сборки#

NumPy теперь может собираться с -W -Wall без предупреждений

https://www.numpy.org/neps/nep-0002-warnfix.html

Отдельная основная математическая библиотека#

Основные математические функции (sin, cos и т.д. для базовых типов C) были помещены в отдельную библиотеку; она действует как слой совместимости для поддержки большинства функций математики C99 (пока только вещественных). Библиотека включает платформо-специфичные исправления для различных математических функций, и использование этих версий должно быть более надежным, чем использование функций вашей платформы напрямую. API для существующих функций точно такой же, как API функций математики C99; единственное отличие — префикс npy (npy_cos против cos).

Основная библиотека будет доступна любому расширению в версии 1.4.0.

Обнаружение архитектуры CPU#

npy_cpu.h определяет специфичные для numpy определения процессора, такие как NPY_CPU_X86 и т.д. Они переносимы между ОС и инструментальными цепочками и настраиваются при разборе заголовка, чтобы их можно было безопасно использовать даже в случае кросс-компиляции (значения не устанавливаются при сборке numpy) или для многоплатформенных двоичных файлов (например, универсальных двоичных файлов на Mac OS X).

npy_endian.h определяет специфичные для numpy определения порядка байтов, смоделированные на основе glibc endian.h. NPY_BYTE_ORDER эквивалентен BYTE_ORDER, и определен один из NPY_LITTLE_ENDIAN или NPY_BIG_ENDIAN. Что касается архитектур ЦП, они устанавливаются, когда заголовок обрабатывается компилятором, и поэтому могут использоваться для кросс-компиляции и мультиархитектурных бинарных файлов.