Можно ли изменить функцию findmax Джулии, чтобы она не принимала значения NaN?

Поскольку у меня есть NaN в моем df (их нельзя заменить никаким другим значением), функция findmax() возвращает NaN как наибольшее найденное значение, что совершенно бесполезно... Я читал несколько блогов и сообщений и ничего не нашел. Чтобы быть более конкретным, могу ли я сделать эту функцию такой же, как np.nanmax() в python?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
45
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

findmax не то же самое, что np.nanmax. Я предполагаю, что вам нужна функциональность np.nanmax, затем выполните:

julia> your_vector = [1.0, NaN, 3.0, NaN, 2.0]
5-element Vector{Float64}:
   1.0
 NaN
   3.0
 NaN
   2.0

julia> maximum(skipmissing(isnan(x) ? missing : x for x in your_vector))
3.0

julia> your_vector = [NaN, NaN]
2-element Vector{Float64}:
 NaN
 NaN

julia> maximum(skipmissing(isnan(x) ? missing : x for x in your_vector))
ERROR: ArgumentError: reducing over an empty collection is not allowed

Хитрость заключается в том, чтобы заменить NaN на missing (но без материализации результата для экономии памяти), а затем пропустить missing. Обратите внимание, что я предложил решение, при котором возникают ошибки, когда присутствуют только NaN. В Python вы получите предупреждение, но в Julia мы обычно избегаем вывода предупреждений, поскольку их очень легко потерять незамеченными, и вместо этого требуется явная обработка или ситуация с ошибкой.

Теперь вы можете спросить, почему нет простого решения для NaN, но есть решение для missing (как и в случае с missing вы бы просто написали maximum(skipmissing(your_vector)))? Ответ заключается в том, что значения NaN обычно не встречаются в кодах Джулии (если только у вас нет каких-либо вычислений, которые производят NaN), в то время как в Python NaN часто используется как значение, которое сигнализирует о том, что у нас есть отсутствующее значение в данных (что распространено).

То, что предложил @DNF, лучше.

Bogumił Kamiński 03.04.2022 18:49
Ответ принят как подходящий

Возможно, более простое решение (и, кажется, более быстрое), чем прохождение skipmissing, это:

foo(itr) = maximum(x for x in itr if !isnan(x))

Правильно - это лучшее решение. Я изначально рассматривал, но с findmax не работает, но и с skipmissing тоже не работает.

Bogumił Kamiński 03.04.2022 18:48

Другие вопросы по теме