Подтвердить что ты не робот

Почему я не могу подавить предупреждения о количестве

Я действительно хочу избежать этих досадных предупреждений о том, что мне приходится иметь дело с большим количеством 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-p‌​ackages/numpy/lib/nanfunctions.py:612: RuntimeWarning: All-NaN slice encountered warnings.warn("All-NaN slice encountered", RuntimeWarning)

Спасибо:)

4b9b3361

Ответ 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 вызывается только в первый раз, когда это происходит во время выполнения.