2

我正在尝试对 python 中的浮点数(和 nan 值)列表进行排序,例如:

print max(list)
list.sort()
list.reverse()
for i in range(100):
    print list[i]
nan
nan
2.0803176458
nan
nan
23.1620761136
15.9680303803
15.3134388394
14.68055076
11.450492644
8.96268420227
8.15331554187
5.24420616524
3.9665322752
3.69758305442
1.08500491226
-0.227894225141
-0.254784399765
-0.866879940573
-1.21267324819
-2.21811678021
nan
nan
2.69325878444

当我运行它时,我最多得到不同的值,并且我的列表在打印出来时没有排序(结果在上面的代码下)

有没有人知道为什么会这样?

4

2 回答 2

5
>>> float('nan') < 3.14
False
>>> float('nan') > 3.14
False
>>> float('nan') < float('nan')
False
>>> float('nan') > float('nan')
False
>>> float('nan') == float('nan')
False

问题是它nan没有相对于其他数字的排序。比较总是返回 False,无论是针对数字还是其他nan值。的合同sort()要求列表项具有一致的顺序才能正确排序。

要进行排序nan,您需要覆盖此行为并定义您想要nan的排序方式。例如,如果您希望它出现在所有其他数字之前,您可以使用一个key函数来nan等效于-inf.

>>> l = [float('nan'), 3.14, -1, 0, float('nan')]
>>> import math
>>> sorted(l, key=lambda f: float('-inf') if math.isnan(f) else f)
[nan, nan, -1, 0, 3.14]
于 2013-08-05T16:09:18.317 回答
3

那是因为 anan不能与任何其他对象(甚至它本身)进行比较。

>>> x = float('nan')
>>> y = x
>>> y == x
False

用于正确numpy处理nan':

>>> import numpy as np
>>> arr = np.array(nums)
>>> np.sort(arr)
array([ -2.21811678,  -1.21267325,  -0.86687994,  -0.2547844 ,
        -0.22789423,   1.08500491,   2.08031765,   2.69325878,
         3.69758305,   3.96653228,   5.24420617,   8.15331554,
         8.9626842 ,  11.45049264,  14.68055076,  15.31343884,
        15.96803038,  23.16207611,          nan,          nan,
                nan,          nan,          nan,          nan])
>>> np.nanmax(arr)
23.162076113600001
>>> np.nanmin(arr)
-2.2181167802099999
于 2013-08-05T16:09:45.707 回答