我很难调试一个问题,当在nan中使用浮点时,list中的浮点nan和numpy.array中的nan被不同地处理
给定以下列表和数组:
from itertools import groupby
import numpy as np
lst = [np.nan, np.nan, np.nan, 0.16, 1, 0.16, 0.9999, 0.0001, 0.16, 0.101, np.nan, 0.16]
arr = np.array(lst)当我遍历列表时,连续的nan被分组:
>>> for key, group in groupby(lst):
... if np.isnan(key):
... print(key, list(group), type(key))
nan [nan, nan, nan] <class 'float'>
nan [nan] <class 'float'>但是,如果我使用这个数组,它会将连续的nan放在不同的组中:
>>> for key, group in groupby(arr):
... if np.isnan(key):
... print(key, list(group), type(key))
nan [nan] <class 'numpy.float64'>
nan [nan] <class 'numpy.float64'>
nan [nan] <class 'numpy.float64'>
nan [nan] <class 'numpy.float64'>即使我将数组转换回列表:
>>> for key, group in groupby(arr.tolist()):
... if np.isnan(key):
... print(key, list(group), type(key))
nan [nan] <class 'float'>
nan [nan] <class 'float'>
nan [nan] <class 'float'>
nan [nan] <class 'float'>我在用:
numpy 1.11.3
python 3.5我知道通常情况下是nan != nan,所以为什么这些操作会给出不同的结果?groupby怎么可能对nan进行分组呢?
发布于 2017-01-18 16:08:17
我不确定这是否是原因,但我只是注意到了nan in lst和arr
>>> lst[0] == lst[1], arr[0] == arr[1]
(False, False)
>>> lst[0] is lst[1], arr[0] is arr[1]
(True, False)也就是说,虽然所有nan都是不相等的,但常规np.nan (类型为float)都是相同的实例,而arr中的nan是numpy.float64类型的不同实例)。因此,我的猜测是,如果没有给出key函数,groupby将在进行更昂贵的等式检查之前测试标识。
这也与arr.tolist()中不分组的观察结果相一致,因为即使这些nan现在又是float,但它们不再是同一个实例。
>>> atl = arr.tolist()
>>> atl[0] is atl[1]
Falsehttps://stackoverflow.com/questions/41723419
复制相似问题