首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么itertools.groupby可以在列表中将NaNs分组,而不能在numpy数组中分组

为什么itertools.groupby可以在列表中将NaNs分组,而不能在numpy数组中分组
EN

Stack Overflow用户
提问于 2017-01-18 15:37:26
回答 3查看 910关注 0票数 17

我很难调试一个问题,当在nan中使用浮点时,list中的浮点nannumpy.array中的nan被不同地处理

给定以下列表和数组:

代码语言:javascript
运行
复制
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被分组:

代码语言:javascript
运行
复制
>>> 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放在不同的组中:

代码语言:javascript
运行
复制
>>> 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'>

即使我将数组转换回列表:

代码语言:javascript
运行
复制
>>> 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'>

我在用:

代码语言:javascript
运行
复制
numpy 1.11.3
python 3.5

我知道通常情况下是nan != nan,所以为什么这些操作会给出不同的结果?groupby怎么可能对nan进行分组呢?

EN

Stack Overflow用户

发布于 2017-01-18 16:08:17

我不确定这是否是原因,但我只是注意到了nan in lstarr

代码语言:javascript
运行
复制
>>> 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中的nannumpy.float64类型的不同实例)。因此,我的猜测是,如果没有给出key函数,groupby将在进行更昂贵的等式检查之前测试标识。

这也与arr.tolist()中不分组的观察结果相一致,因为即使这些nan现在又是float,但它们不再是同一个实例。

代码语言:javascript
运行
复制
>>> atl = arr.tolist()
>>> atl[0] is atl[1]
False
票数 5
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41723419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档