欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > python >内容正文

python

java难学还是pythonnanxue_关于python:为什么numpy中的“ NaN”比“ -np.inf”更小?

发布时间:2025/3/15 python 33 豆豆
生活随笔 收集整理的这篇文章主要介绍了 java难学还是pythonnanxue_关于python:为什么numpy中的“ NaN”比“ -np.inf”更小? 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

在涉及np.min或np.argmin的任何比较中,认为NaN小于-np.inf的原因是什么?

import numpy as np

In [73]: m = np.array([np.nan, 1., 0., -np.inf])

In [74]: n = np.array([-np.inf, 1., 0., np.nan])

# Huh??

In [75]: np.min(m)

Out[75]: nan

In [76]: np.min(n)

Out[76]: nan

# Same for np.argmin

In [77]: np.argmin(m)

Out[77]: 0

In [78]: np.argmin(n)

Out[78]: 3

# Its all false!

In [79]: np.nan < -np.inf

Out[79]: False

In [80]: np.nan > -np.inf

Out[80]: False

# OK, that seems to fix it, but its not necessarily elegant

In [81]: np.nanmin(m)

Out[81]: -inf

In [82]: np.nanargmin(m)

Out[82]: 3

我想这可能与将NaN值返回False的任何比较产生副作用,但是当您"偶然"有时在数组中最终以NaN值结尾时,这种恕我直言会带来一些相当烦人的效果。 np.nanmin或np.nanargmin的使用感觉就像是一种快速修复程序,该修复程序以某种方式装订在现有行为之上。

除了文档中的注释外:"传播NaN值,也就是说,如果至少一项是NaN,则相应的最小值也将是NaN。要忽略NaN值(MATLAB行为),请使用nanmin。 没有找到任何能解释该行为背后原因的信息。这是通缉还是NaN值的特定内部表示的副作用?为什么?

您可能会发现此答案很有帮助:stackoverflow.com/questions/1565164/

这是一种逻辑行为:如果某物不是数字,则无法将其与是数字的任何东西进行比较,因此,任何比较均返回false。 不仅如此-人们可以说在大多数情况下,NaN不是某些操作的理想结果,因此它应该像其他任何异常一样传播。

请参阅最近的答案stackoverflow.com/a/41324751/901925。 在此功能和相关功能中,NaN被显式编码为maximal。

您的前提不正确。 np.nan对于任何其他数字(包括它自己)都是无序的,不会引发错误。 虽然小于,但它也大于且不等于任何其他数字-包括其自身。 这是IEEE 754的一部分。实现细节是如果用信号处理NaN或安静地处理NaN。 脾气暴躁的对待安静。

正如@Dunno在评论中提到的,将NaN与数字进行比较并没有太多意义,因此这种行为可能是可以的。 IEEE 754标准说明了将NaN与数字进行比较的方法:

Four mutually exclusive relations are possible: less than, equal, greater than, and unordered. The last case

arises when at least one operand is NaN. Every NaN shall compare unordered with everything, including

itself

根据标准,这是:

# Its all false!

In [79]: np.nan < -np.inf

Out[79]: False

将导致"无序"结果,因此它属于"小于"关系是不正确的。

该解释的问题在于,Python中没有"无序"类别,因此np.nan < 5,np.nan > 5和np.nan == 5不能全部求和为False,但是它们确实是。 如果您开始在常规Python语句中使用np.nan,则将引起各种麻烦。 例如:min([5, np.nan])-> 5,而min([np.nan, 5])-> np.nan。 我想知道为什么np.nan支持比较并且不会像None那样引发TypeError。

因此,您可能已经知道:

" inf"是无穷大-一个大于任何其他值的值。因此,"-inf"小于任何其他值。请记住,该值是一个数字。

" nan"表示不是数字。

因此,如果根据您在上面声明的数组" m,n"以及一旦对其中任何一个执行" np.min()",实际上发生的就是在遇到" nan"时其他元素就不会检查或比较并执行以下语句并返回值:

if (@isnan@(mp)) { /* nan encountered; it's maximal */ return 0; }

因此返回" nan"作为函数的答案!

检查此代码,遇到第一个" nan"后立即返回,并在相应函数中返回其位置

In [1]: import numpy as np

In [2]: m = np.array([1., 0., -np.inf, np.nan])

In [3]: n = np.array([np.nan, 1., np.nan, 0.])

In [4]: np.argmin(m)

Out[4]: 3

In [5]: np.argmin(n)

Out[5]: 0

并且" np.nan -np.inf"之类的操作返回" False",因为此处" nan"不能与任何数字" -inf"和" False"进行比较在上述每种情况下,操作都不是比较的答案,而是由于一种异常或上述代码的执行,这是由于逻辑错误而引起的,因为尽管无穷大,但相对于"无"而言到一个数字!

因此,如果删除数组中的所有" nan",然后通过" np.nanmin()"计算min,则输出将如预期的那样-inf,这不会出现问题!

因此," Nan"不小于或大于" inf"或" -inf",因为实际上它与任何这些数字或任何数字都不可比,与任何数字相比,它将返回" False"!

In [1]: np.nan < 1

Out[1]: False

In [2]: np.nan > 1

Out[2]: False

等等 ...............

希望能帮助到你 !!

从技术上讲,numpy c代码不会引发异常,它只会返回。 if (@isnan@(mp)) { * nan encountered; its maximal * return 0; }。 stackoverflow.com/questions/41320568/

是的,通过引发异常,我的意思是,一旦遇到" nan",我便停止了正常执行,我不知道谢谢@hpaulj

总结

以上是生活随笔为你收集整理的java难学还是pythonnanxue_关于python:为什么numpy中的“ NaN”比“ -np.inf”更小?的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。