Примечания к выпуску NumPy 1.3.0#
Этот минорный выпуск включает многочисленные исправления ошибок, официальную поддержку python 2.6 и несколько новых функций, таких как обобщённые ufuncs.
Основные моменты#
Поддержка Python 2.6#
Python 2.6 теперь поддерживается на всех ранее поддерживаемых платформах, включая Windows.
Обобщённые универсальные функции#
Существует общая необходимость в циклах не только для функций над скалярами, но и для функций над векторами (или массивами), как объяснено на 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#
fmax — то же, что и maximum для целочисленных типов и не-nan чисел с плавающей точкой. Возвращает не-nan аргумент, если один аргумент является nan, и возвращает nan, если оба аргумента являются nan.
fmin — то же, что и minimum для целочисленных типов и не-NaN float. Возвращает не-NaN аргумент, если один аргумент — NaN, и возвращает NaN, если оба аргумента — NaN.
deg2rad - преобразует градусы в радианы, аналогично ufunc radians.
rad2deg - преобразует радианы в градусы, аналогично ufunc degrees.
log2 - логарифм по основанию 2.
exp2 - экспонента по основанию 2.
trunc — усечение чисел с плавающей запятой до ближайшего целого в сторону нуля.
logaddexp - складывает числа, хранящиеся как логарифмы, и возвращает логарифм результата.
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.
Устаревшие функции#
Гистограмма#
Семантика гистограммы была изменена для исправления давних проблем с обработкой выбросов. Основные изменения касаются
определение границ бинов, теперь включая самую правую границу, и
обработка верхних выбросов, теперь игнорируется, а не учитывается в крайнем правом бине.
Предыдущее поведение всё ещё доступно с использованием 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#
Это должно упростить портирование на новые платформы и сделать его более надёжным. В частности, этап конфигурации не требует выполнения какого-либо кода на целевой платформе, что является первым шагом к кросс-компиляции.
рефакторинг umath#
Много очистки кода для umath/ufunc кода (charris).
Улучшения в предупреждениях сборки#
NumPy теперь может собираться с -W -Wall без предупреждений
Отдельная основная математическая библиотека#
Основные математические функции (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. Что касается архитектур ЦП, они устанавливаются, когда заголовок обрабатывается компилятором, и поэтому могут использоваться для кросс-компиляции и мультиархитектурных бинарных файлов.