Spec-Zone.ru › NumPy 1.18

Разное

Специальные значения с плавающей запятой IEEE 754

Определенные в numpy специальные значения: nan, inf,

NaN можно использовать как маску (если вам неважно, какое было исходное значение)

Примечание: нельзя использовать равенство для проверки NaN. Например:

>>> myarr = np.array([1., 0., np.nan, 3.])
>>> np.nonzero(myarr == np.nan)
(array([], dtype=int64),)
>>> np.nan == np.nan  # is always False! Use special numpy functions instead.
False
>>> myarr[myarr == np.nan] = 0. # doesn't work
>>> myarr
array([  1.,   0.,  NaN,   3.])
>>> myarr[np.isnan(myarr)] = 0. # use this instead find
>>> myarr
array([ 1.,  0.,  0.,  3.])

Другие связанные функции для специальных значений:

isinf():    True if value is inf
isfinite(): True if not nan or inf
nan_to_num(): Map nan to 0, inf to max float, -inf to min float

Следующие функции соответствуют обычным функциям, за исключением того, что значения nan исключаются из результатов:

nansum()
nanmax()
nanmin()
nanargmax()
nanargmin()

>>> x = np.arange(10.)
>>> x[3] = np.nan
>>> x.sum()
nan
>>> np.nansum(x)
42.0

Как numpy обрабатывает числовые исключения

По умолчанию выполняется 'warn' для invalid, divide, и overflow и 'ignore' для underflow. Но это можно изменить, и это можно настроить индивидуально для разных типов исключений. Разные варианты поведения:

  • ‘ignore’ : Не предпринимать никаких действий при возникновении исключения.
  • ‘warn’ : Вывести предупреждение (через модуль Python warnings).
  • ‘raise’ : Вызвать исключение FloatingPointError.
  • ‘call’ : Вызвать функцию, указанную с помощью функции seterrcall.
  • ‘print’ : Вывести предупреждение напрямую в stdout.
  • ‘log’ : Записать ошибку в объект журнала, указанный в seterrcall.

Эти варианты поведения можно установить для всех типов ошибок или конкретных:

  • all : применяется ко всем числовым исключениям
  • invalid : при генерации NaN
  • divide : деление на ноль (и для целых чисел!)
  • overflow : переполнение чисел с плавающей точкой
  • underflow : подпоточные переполнения чисел с плавающей точкой

Обратите внимание, что деление на ноль для целых чисел обрабатывается той же механикой. Эти варианты поведения задаются для каждой нити.

Примеры

>>> oldsettings = np.seterr(all='warn')
>>> np.zeros(5,dtype=np.float32)/0.
invalid value encountered in divide
>>> j = np.seterr(under='ignore')
>>> np.array([1.e-100])**10
>>> j = np.seterr(invalid='raise')
>>> np.sqrt(np.array([-1.]))
FloatingPointError: invalid value encountered in sqrt
>>> def errorhandler(errstr, errflag):
...      print("saw stupid error!")
>>> np.seterrcall(errorhandler)
<function err_handler at 0x...>
>>> j = np.seterr(all='call')
>>> np.zeros(5, dtype=np.int32)/0
FloatingPointError: invalid value encountered in divide
saw stupid error!
>>> j = np.seterr(**oldsettings) # restore previous
...                              # error-handling settings

Интеграция с C

Только обзор вариантов. Мало подробностей о том, как работает каждый из них.

  1. Базовый уровень, вручную оберните свой собственный C-код.
  • Плюсы:

    • Эффективно
    • Нет зависимостей от других инструментов
  • Минусы:

    • Много накладных расходов на обучение:

      • нужно изучить основы API Python C
      • нужно изучить основы API numpy C
      • нужно изучить, как обрабатывать счетчик ссылок и любить это.
    • Счетчик ссылок часто трудно реализовать правильно.

      • неправильная реализация приводит к утечкам памяти и, что еще хуже, к сбоям сегментов
    • API будет изменён для Python 3.0!
  1. Cython
  • Плюсы:

    • избегайте изучения API C
    • не нужно обрабатывать счетчик ссылок
    • можно кодировать псевдо-python и генерировать C-код
    • также можно интегрироваться с существующим C-кодом
    • должен защитить от изменений API Python C
    • стал фактическим стандартом в научном сообществе Python
    • быстрая поддержка индексации для массивов
  • Минусы:

    • Можно писать код в нестандартной форме, который может устареть
    • Не так гибко, как ручная обёртка
  1. ctypes
  • Плюсы:

    • часть стандартной библиотеки Python
    • подходит для интеграции с существующими библиотеками, особенно DLL Windows
    • избегает проблем с API/счётчиком ссылок
    • хорошая поддержка numpy: массивы содержат все эти в своём атрибуте ctypes:

      a.ctypes.data              a.ctypes.get_strides
      a.ctypes.data_as           a.ctypes.shape
      a.ctypes.get_as_parameter  a.ctypes.shape_as
      a.ctypes.get_data          a.ctypes.strides
      a.ctypes.get_shape         a.ctypes.strides_as
      
  • Минусы:

    • нельзя использовать для написания кода, который превратится в расширения C, только инструмент обёртки.
  1. SWIG (генератор автоматической обёртки)
  • Плюсы:

    • существует давно
    • поддержка множества языков сценариев
    • поддержка C++
    • Хорошо подходит для обёртки больших (множество функций) существующих C-библиотек
  • Минусы:

    • генерирует много кода между Python и C-кодом
    • может вызвать проблемы производительности, которые почти невозможно оптимизировать
    • файлы интерфейса могут быть сложными для написания
    • не обязательно избегает проблем со счетчиком ссылок или необходимости знать API
  1. scipy.weave
  • Плюсы:

    • может преобразовать многие выражения numpy в C-код
    • динамическая компиляция и загрузка сгенерированного C-кода
    • можно встроить чистый C-код в модуль Python, и weave извлечёт, сгенерирует интерфейсы и скомпилирует и т.д.
  • Минусы:

    • Будущее очень неопределённое: это единственная часть Scipy, не портированная на Python 3, и фактически устарела в пользу Cython.
  1. Psyco
  • Плюсы:

    • Преобразует чистый Python в эффективный машинный код с помощью оптимизаций типа JIT
    • очень быстро, когда хорошо оптимизируется
  • Минусы:

    • Только на Intel (Windows?)
    • Не делает много для numpy?

Интеграция с Fortran:

Явный выбор для обёртки Fortran-кода — f2py.

Pyfort — более старый вариант, но больше не поддерживается. Fwrap — новый проект, который выглядел многообещающим, но больше не развивается.

Интеграция с C++:

  1. Cython
  2. CXX
  3. Boost.python
  4. SWIG
  5. SIP (используется в основном в PyQT)

© 2005–2020 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.18/user/misc.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API