Почему я не могу подавить предупреждения о количестве
Я действительно хочу избежать этих досадных предупреждений о том, что мне приходится иметь дело с большим количеством NaNs
. Я знаю, что это обычно делается с помощью seterr, но почему-то здесь это не работает:
import numpy as np
data = np.random.random(100000).reshape(10, 100, 100) * np.nan
np.seterr(all="ignore")
np.nanmedian(data, axis=[1, 2])
Это дает мне предупреждение во время выполнения, хотя я устанавливаю numpy, чтобы игнорировать все ошибки... любую помощь?
Изменить (это предупреждение, которое получено):
/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/numpy/lib/nanfunctions.py:612: RuntimeWarning: All-NaN slice encountered warnings.warn("All-NaN slice encountered", RuntimeWarning)
Спасибо:)
Ответы
Ответ 1
Предупреждения часто могут быть полезны, и в большинстве случаев я бы не советовал этого, но вы всегда можете использовать модуль Warnings
чтобы игнорировать все предупреждения с предупреждениями filterwarnings
:
warnings.filterwarnings('ignore')
Если вы хотите однозначно подавить конкретную ошибку, вы можете указать ее с помощью:
with warnings.catch_warnings():
warnings.filterwarnings('ignore', r'All-NaN (slice|axis) encountered')
Ответ 2
Предупреждения, контролируемые seterr()
, - это те, которые выдаются машиной numpy ufunc; например когда A / B
создает NaN
в коде C, который реализует деление, скажем, потому что в этих массивах был inf/inf
. Другой код numpy может выдавать собственные предупреждения по другим причинам. В этом случае вы используете одну из функций сокращения NaN
-ignoring, например nanmin()
или тому подобное. Вы передаете ему массив, содержащий все NaN
s или, по крайней мере, все NaN
вдоль оси, на которую вы запросили сокращение. Поскольку обычной причиной использования nanmin()
является не получение другого NaN
out, nanmin()
выдаст предупреждение о том, что у него нет выбора, кроме как дать вам NaN
. Это относится непосредственно к стандартной библиотеке warnings
, а не к устройству с ошибкой numpy ufunc, поскольку оно не является ufunc, и это производство NaN
не совпадает с тем, что seterr(invalid=...)
в противном случае имеет дело с.
Ответ 3
Вы можете избежать подавления предупреждения, потому что numpy поднимает это по уважительной причине. Если вы хотите очистить вывод, возможно, обработайте его, явно вернув предварительно определенное значение, когда весь массив равен nan.
def clean_nanmedian(s):
if np.all(np.isnan(s)):
return np.nan
return np.nanmedian(s)
Также имейте в виду, что это RuntimeWarning вызывается только в первый раз, когда это происходит во время выполнения.