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

Этот минорный выпуск включает множество исправлений ошибок, а также несколько новых функций. Он обратно совместим с выпуском 1.3.0.

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

  • Новая поддержка типа данных datetime для работы с датами в массивах

  • Более быстрое время импорта

  • Расширенный механизм обёртки массивов для ufuncs

  • Новый итератор соседства (только на уровне C)

  • C99-подобные комплексные функции в npymath

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

Расширенный механизм обёртки массивов для ufuncs#

Метод __array_prepare__ был добавлен в ndarray, чтобы предоставить подклассам большую гибкость во взаимодействии с ufuncs и подобными функциями. ndarray уже предоставлял __array_wrap__, который позволял подклассам устанавливать тип массива для результата и заполнять метаданные на выходе из ufunc (как видно в реализации MaskedArray). Для некоторых приложений необходимо предоставлять проверки и заполнять метаданные на входе. __array_prepare__ вызывается сразу после инициализации выходного массива ufunc, но перед вычислением результатов и заполнением. Таким образом, проверки могут быть выполнены и ошибки вызваны до операций, которые могут изменять данные на месте.

Автоматическое обнаружение несовместимостей в будущем#

Ранее, если расширение было собрано для версии N NumPy и использовалось в системе с NumPy M < N, import_array завершался успешно, что могло приводить к сбоям, поскольку версия M не содержит функцию из версии N. Начиная с NumPy 1.4.0, это вызовет ошибку в import_array, поэтому ошибка будет обнаружена на раннем этапе.

Новые итераторы#

В C API добавлен новый итератор окрестностей. Его можно использовать для итерации по элементам в окрестности массива, и он может автоматически обрабатывать граничные условия. Доступны нулевое и единичное заполнение, а также заполнение произвольным постоянным значением, зеркальное и циклическое заполнение.

Новая поддержка полиномов#

Добавлены новые модули chebyshev и polynomial. Новый модуль polynomial не совместим с текущей поддержкой полиномов в numpy, но очень похож на новый модуль chebyshev. Наиболее заметное отличие для большинства будет в том, что коэффициенты указываются от низкой к высокой степени, что низкоуровневые функции не не работать с классами Чебышёва и Полинома как аргументами, и что классы Чебышёва и Полинома включают домен. Отображение между доменами — это линейная подстановка, и два класса могут быть преобразованы один в другой, позволяя, например, разложить ряд Чебышёва в одном домене как полином в другом домене. Новые классы в целом должны использоваться вместо низкоуровневых функций, последние предоставлены для тех, кто хочет построить свои собственные классы.

Новые модули не импортируются автоматически в пространство имён numpy, их необходимо явно импортировать с помощью оператора "import numpy.polynomial".

Новый C API#

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

  1. PyArray_GetNDArrayCFeatureVersion: возвращает API версия загруженного numpy.

  2. PyArray_Correlate2 - как PyArray_Correlate, но реализует обычное определение корреляции. Входные данные не меняются местами, и для комплексных массивов берётся сопряжённое значение.

  3. PyArray_NeighborhoodIterNew - новый итератор для перебора окрестности точки с автоматической обработкой границ. Он документирован в разделе итераторов справочника C-API, и вы можете найти примеры в файле multiarray_test.c.src в numpy.core.

Новые ufuncs#

В C API были добавлены следующие универсальные функции (ufuncs):

  1. copysign - возвращает значение первого аргумента со знаком, скопированным из второго аргумента.

  2. nextafter — возвращает следующее представимое значение с плавающей запятой первого аргумента в направлении второго аргумента.

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

Процессор alpha теперь определен и доступен в numpy/npy_cpu.h. Исправлено некорректное обнаружение процессора PARISC. Определения:

  1. NPY_CPU_HPPA: PARISC

  2. NPY_CPU_ALPHA: Alpha

Тестирование#

  1. декоратор deprecated: этот декоратор может использоваться для избежания загромождения вывода тестирования, пока проверяется, что DeprecationWarning действительно вызывается декорированным тестом.

  2. assert_array_almost_equal_nulp: новый метод для сравнения двух массивов значений с плавающей точкой. С этой функцией два значения считаются близкими, если между ними не много представимых значений с плавающей точкой, что делает её более устойчивой, чем assert_array_almost_equal, когда значения сильно колеблются.

  3. assert_array_max_ulp: вызывает утверждение, если между двумя значениями с плавающей точкой больше N представимых чисел.

  4. assert_warns: вызывает AssertionError, если вызываемый объект не генерирует предупреждение соответствующего класса, не изменяя состояние предупреждений.

Повторное использование npymath#

В версии 1.3.0 мы начали размещать переносимые математические процедуры на C в библиотеке npymath, чтобы люди могли использовать их для написания переносимых расширений. К сожалению, было невозможно легко связаться с этой библиотекой: в версии 1.4.0 была добавлена поддержка в numpy.distutils, чтобы сторонние разработчики могли повторно использовать эту библиотеку. См. документацию coremath для получения дополнительной информации.

Улучшенные операции над множествами#

В предыдущих версиях NumPy некоторые функции множеств (intersect1d, setxor1d, setdiff1d и setmember1d) могли возвращать некорректные результаты, если входные массивы содержали повторяющиеся элементы. Теперь они работают корректно для входных массивов с дубликатами. setmember1d переименована в in1d, так как с изменением для принятия массивов с дубликатами это больше не операция над множествами и концептуально похожа на поэлементную версию оператора Python 'in'. Все эти функции теперь принимают логическое ключевое слово assume_unique. По умолчанию оно равно False, но может быть установлено в True, если известно, что входные массивы не содержат дубликатов, что может увеличить скорость выполнения функций.

Улучшения#

  1. Импорт numpy заметно быстрее (от 20 до 30% в зависимости от платформы и компьютера)

  2. Функции сортировки теперь помещают nan в конец.

    • Реальный порядок сортировки: [R, nan]

    • Порядок сортировки комплексных чисел: [R + Rj, R + nanj, nan + Rj, nan + nanj]

    Комплексные числа с одинаковым расположением nan сортируются в соответствии с не-nan частью, если она существует.

  3. Функции сравнения типов были приведены в соответствие с новым порядком сортировки nan. Searchsorted теперь работает с отсортированными массивами, содержащими значения nan.

  4. Деление комплексных чисел стало более устойчивым к переполнению.

  5. Комплексное целочисленное деление стало более устойчивым к переполнению.

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

Следующие функции устарели:

  1. correlate: принимает новый аргумент old_behavior. При значении True (по умолчанию) возвращает тот же результат, что и раньше. При значении False вычисляет обычную корреляцию и берёт сопряжённое значение для комплексных массивов. Старое поведение будет удалено в NumPy 1.5 и вызывает DeprecationWarning в версии 1.4.

  2. unique1d: используйте unique вместо этого. unique1d вызывает предупреждение об устаревании в версии 1.4 и будет удалён в версии 1.5.

  3. intersect1d_nu: используйте intersect1d вместо этого. intersect1d_nu вызывает предупреждение об устаревании в версии 1.4 и будет удален в версии 1.5.

  4. setmember1d: используйте in1d вместо. setmember1d вызывает предупреждение об устаревании в версии 1.4 и будет удален в версии 1.5.

Следующие вызовы вызывают ошибки:

  1. При работе с 0-d массивами, numpy.max и другие функции принимают только axis=0, axis=-1 и axis=None. Использование осей вне допустимого диапазона указывает на ошибку, поэтому Numpy теперь вызывает ошибку в таких случаях.

  2. Указание axis > MAX_DIMS больше не разрешено; Numpy теперь вызывает ошибку вместо поведения, аналогичного axis=None.

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

Использовать функции комплексных чисел C99, когда они доступны#

Комплексные типы numpy теперь гарантированно совместимы с ABI с типом complex C99, если он доступен на платформе. Более того, комплексные ufunc теперь используют функции C99 платформы вместо наших собственных.

разделить исходный код multiarray и umath#

Исходный код multiarray и umath был разделён на отдельные логические единицы компиляции. Это должно сделать исходный код более доступным для новичков.

Раздельная компиляция#

По умолчанию каждый файл multiarray (и umath) объединяется в один для компиляции, как это было раньше, но если переменная окружения NPY_SEPARATE_COMPILATION установлена в неотрицательное значение, включается экспериментальная индивидуальная компиляция каждого файла. Это значительно ускоряет цикл компиляции/отладки при работе с ядром numpy.

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

Новые функции, которые были добавлены:

  • npy_copysign

  • npy_nextafter

  • npy_cpack

  • npy_creal

  • npy_cimag

  • npy_cabs

  • npy_cexp

  • npy_clog

  • npy_cpow

  • npy_csqr

  • npy_ccos

  • npy_csin