可以修改 Julia 的 findmax 函数,使其不采用 NaN 值吗?
can the findmax function of Julia be modified so it doesnt take the NaN values?
因为我的 df 中有 NaN(它们不能被任何其他值替换),findmax() 函数 returns NaN 作为找到的最大值,这根本没有用......
我一直在阅读几个博客和帖子,但一无所获。
更具体地说,无论如何我可以使这个功能像python的np.nanmax()?
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
诀窍是用missing
替换NaN
(但不具体化结果以节省内存)然后跳过missing
。请注意,我提出了一个解决方案,当仅存在 NaN
时会出错。在 Python 中你会收到警告,但在 Julia 中我们通常避免打印警告,因为它们很容易在不被注意的情况下丢失,而是需要明确的处理或错误情况。
现在您可能会问为什么 NaN
没有简单的解决方案,但是 missing
有一个解决方案(对于 missing
,您只需写 maximum(skipmissing(your_vector))
)?答案是 NaN
值在 Julia 代码中通常不会遇到(除非你确实有一些计算产生 NaN
),而在 Python 中 NaN
通常用作值这表明我们在数据中有缺失值(这很常见)。
也许比 skipmissing
更简单的解决方案(看起来也更快)是:
foo(itr) = maximum(x for x in itr if !isnan(x))
因为我的 df 中有 NaN(它们不能被任何其他值替换),findmax() 函数 returns NaN 作为找到的最大值,这根本没有用...... 我一直在阅读几个博客和帖子,但一无所获。 更具体地说,无论如何我可以使这个功能像python的np.nanmax()?
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
诀窍是用missing
替换NaN
(但不具体化结果以节省内存)然后跳过missing
。请注意,我提出了一个解决方案,当仅存在 NaN
时会出错。在 Python 中你会收到警告,但在 Julia 中我们通常避免打印警告,因为它们很容易在不被注意的情况下丢失,而是需要明确的处理或错误情况。
现在您可能会问为什么 NaN
没有简单的解决方案,但是 missing
有一个解决方案(对于 missing
,您只需写 maximum(skipmissing(your_vector))
)?答案是 NaN
值在 Julia 代码中通常不会遇到(除非你确实有一些计算产生 NaN
),而在 Python 中 NaN
通常用作值这表明我们在数据中有缺失值(这很常见)。
也许比 skipmissing
更简单的解决方案(看起来也更快)是:
foo(itr) = maximum(x for x in itr if !isnan(x))