Разное
Специальные значения с плавающей запятой 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
Только обзор вариантов. Мало подробностей о том, как работает каждый из них.
- Базовый уровень, вручную оберните свой собственный C-код.
-
Плюсы:
- Эффективно
- Нет зависимостей от других инструментов
-
Минусы:
-
Много накладных расходов на обучение:
- нужно изучить основы API Python C
- нужно изучить основы API numpy C
- нужно изучить, как обрабатывать счетчик ссылок и любить это.
-
Счетчик ссылок часто трудно реализовать правильно.
- неправильная реализация приводит к утечкам памяти и, что еще хуже, к сбоям сегментов
- API будет изменён для Python 3.0!
-
- Cython
-
Плюсы:
- избегайте изучения API C
- не нужно обрабатывать счетчик ссылок
- можно кодировать псевдо-python и генерировать C-код
- также можно интегрироваться с существующим C-кодом
- должен защитить от изменений API Python C
- стал фактическим стандартом в научном сообществе Python
- быстрая поддержка индексации для массивов
-
Минусы:
- Можно писать код в нестандартной форме, который может устареть
- Не так гибко, как ручная обёртка
- 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, только инструмент обёртки.
- SWIG (генератор автоматической обёртки)
-
Плюсы:
- существует давно
- поддержка множества языков сценариев
- поддержка C++
- Хорошо подходит для обёртки больших (множество функций) существующих C-библиотек
-
Минусы:
- генерирует много кода между Python и C-кодом
- может вызвать проблемы производительности, которые почти невозможно оптимизировать
- файлы интерфейса могут быть сложными для написания
- не обязательно избегает проблем со счетчиком ссылок или необходимости знать API
- scipy.weave
-
Плюсы:
- может преобразовать многие выражения numpy в C-код
- динамическая компиляция и загрузка сгенерированного C-кода
- можно встроить чистый C-код в модуль Python, и weave извлечёт, сгенерирует интерфейсы и скомпилирует и т.д.
-
Минусы:
- Будущее очень неопределённое: это единственная часть Scipy, не портированная на Python 3, и фактически устарела в пользу Cython.
- Psyco
-
Плюсы:
- Преобразует чистый Python в эффективный машинный код с помощью оптимизаций типа JIT
- очень быстро, когда хорошо оптимизируется
-
Минусы:
- Только на Intel (Windows?)
- Не делает много для numpy?
Интеграция с Fortran:
Явный выбор для обёртки Fortran-кода — f2py.
Pyfort — более старый вариант, но больше не поддерживается. Fwrap — новый проект, который выглядел многообещающим, но больше не развивается.
Интеграция с C++:
- Cython
- CXX
- Boost.python
- SWIG
- SIP (используется в основном в PyQT)
© 2005–2020 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.18/user/misc.html