Автор оригинала: Chris.
Постановка проблемы
Вы используете Numpy’s NP.NANMEAN () Функция в вашем коде, который должен игнорировать Нан
Значения при вычислении среднего значения Numpy Array.
import numpy as np a = np.array([np.NaN, np.NaN]) mean = np.nanmean(a)
Но при использовании этого Numpy поднимает Runtimewarning: Средство от пустого ломтика
сообщение:
Warning (from warnings module): File "C:\Users\xcent\Desktop\code.py", line 3 mean = np.nanmean(a) RuntimeWarning: Mean of empty slice
В чем причина этого предупреждения и как это исправить?
Решение + объяснение
Причина, по которой возникает это предупреждение, потому что вы применяете NP.NANMEAN ()
Функция на пустом массиве. Функция не вызывает ошибки, если массив имеет хотя бы одно ненанское значение:
>>> np.nanmean([0.42, np.NaN, np.NaN]) 0.42
Если хотя бы один элемент представляет собой числовое значение, среднее значение четко определено: сумма над всеми элементами, которые не являются Нан
и разделить количество этих элементов.
Однако, если все элементы в Numpy Array есть НП. Нан
Numpy поднимает Runtimewarning
:
>>> np.nanmean([np.NaN, np.NaN]) Warning (from warnings module): File "C:\Users\xcent\Desktop\code.py", line 1 import numpy as np RuntimeWarning: Mean of empty slice nan
Тем не менее, вы также можете увидеть, что он все еще генерирует возвращаемое значение: Не – номер или Нан
Отказ
Поскольку этот пограничный случай правильно определен и однозначно, это вызвало некоторые программисты для Спросите Имеет ли это даже смысл выпускать это предупреждение.
💡 На мой взгляд, выдача предупреждения не имеет большого смысла в случае NP.NANMEAN ()
функция. От Python’s Дзэн Питона мы знаем, что «Явное лучше, чем неявное» Отказ Итак, либо поднимите исключение, и позвольте программисту справляться с ним напрямую или просто позвольте ему пройти, если все правильно определено.
Если я, как я, вы раздражены этим предупреждением, вы можете просто подавить его:
Как подавить Runtimewarning?
Менеджер контекста предупреждения .Catch_warnings
подавляет предупреждение, но только если вы действительно предвидите его. В противном случае вы можете пропустить несколько дополнительных Runtimewarning
s Ты не видел приходить.
import numpy as np import warnings with warnings.catch_warnings(): warnings.simplefilter("ignore", category=RuntimeWarning) mean = np.nanmean([np.NaN, np.NaN]) print(mean)
Выход без предупреждения:
nan
Однако вы должны быть уверены, что это единственное предупреждение, которое может появиться в с
Блок-среда. В противном случае вы можете пропустить несколько важных предупреждений, которые уже обсуждались.
Более безопасный путь, вероятно, будет использовать предупреждения. Фильтеррынарны (действие = «игнорировать»,)
Впустить не предвидеть Runtimewarning
с.
Альтернативное решение: Проверьте значение для всех нан
Если вам не нравится предыдущее решение для его отсутствия краткости, подобных мне, вы также можете обоснованно проверять, содержит ли массив только Нан
ценности. Если это так, вы просто сложный код, чтобы быть Нан
даже не бежать NP.NANMEAN ()
Функция, которая генерирует предупреждающее сообщение.
Следующий код создает пользовательскую функцию numpy_nan_mean ()
который принимает массив в качестве ввода и возвращает среднее значение или нан
Если все значения являются НП. Нан
Отказ
import numpy as np def numpy_nan_mean(a): return np.NaN if np.all(a!=a) else np.nanmean(a) print(numpy_nan_mean([np.NaN, np.NaN, np.NaN])) # nan print(numpy_nan_mean([np.NaN, np.NaN, 1.23])) # 1.23
Код использует наблюдение, которое сравнило два НП. Нан
Значения всегда будут возвращаться Ложь
. Только если все значения – НП. Нан
Будет ли функция звонить NP.all (A! = A)
Возвращение Правда
Отказ
>>> np.NaN == np.NaN False
Мы используем Тровый одноклассник Оператор X Если вы еще Z
вернуть НП. Нан
в этом конкретном случае вместо выполнения NP.NANMEAN ()
Функция, которая дала бы предупреждение.
Runtimewarning – расчет среднего из пустого массива
Интересно, что есть еще один источник этого предупреждающего сообщения: если вы попытаетесь рассчитать NP.NANMEAN ([])
пустого разменного массива или пустой Список :
>>> np.nanmean([]) Warning (from warnings module): File "C:\Users\xcent\Desktop\code.py", line 1 import numpy as np RuntimeWarning: Mean of empty slice nan
Вы можете исправить это, сначала проверяя массив для пустоты и вычисляю только среднее значение, если оно не пустое:
>>> def nanmean(a): if a.size == 0: return np.NaN else: return np.nanmean(a) >>> nanmean(np.array([])) nan >>> nanmean(np.array([1, 2, 3])) 2.0
Куда пойти отсюда?
Достаточно теории, давайте познакомимся!
Чтобы стать успешным в кодировке, вам нужно выйти туда и решать реальные проблемы для реальных людей. Вот как вы можете легко стать шестифункциональным тренером. И вот как вы польские навыки, которые вам действительно нужны на практике. В конце концов, что такое использование теории обучения, что никто никогда не нуждается?
Практические проекты – это то, как вы обостряете вашу пилу в кодировке!
Вы хотите стать мастером кода, сосредоточившись на практических кодовых проектах, которые фактически зарабатывают вам деньги и решают проблемы для людей?
Затем станьте питоном независимым разработчиком! Это лучший способ приближения к задаче улучшения ваших навыков Python – даже если вы являетесь полным новичком.
Присоединяйтесь к моему бесплатным вебинаре «Как создать свой навык высокого дохода Python» и посмотреть, как я вырос на моем кодированном бизнесе в Интернете и как вы можете, слишком от комфорта вашего собственного дома.
Присоединяйтесь к свободному вебинару сейчас!
Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.
Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.
Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.
Оригинал: “https://blog.finxter.com/numpy-runtimewarning-mean-of-empty-slice/”