python numpy和pandas库的区别_python – 来自熊猫和numpy的意思不同

简洁版本:

之所以不同,是因为在调用平均操作时,pandas会使用瓶颈(如果已安装),而不是仅仅依赖于numpy.据推测,瓶颈似乎比numpy更快(至少在我的机器上),但代价是精确度.它们碰巧匹配64位版本,但32位不同(这是有趣的部分).

长版:

通过检查这些模块的源代码来判断发生了什么是非常困难的(它们非常复杂,即使是像平均值这样的简单计算,也很难说数值计算很难).最好使用调试器来避免大脑编译和那些类型的错误.调试器不会在逻辑上出错,它会告诉你究竟发生了什么.

这是我的一些堆栈跟踪(由于没有RNG的种子,值略有不同):

可以重现(Windows):

>>> import numpy as np; import pandas as pd

>>> x=np.random.normal(-9.,.005,size=900000)

>>> df=pd.DataFrame(x,dtype='float32',columns=['x'])

>>> df['x'].mean()

-9.0

>>> x.mean()

-9.0000037501099754

>>> x.astype(np.float32).mean()

-9.0000029

numpy的版本没什么特别的.这是熊猫版本有点古怪.

让我们来看看df [‘x’].mean():

>>> def test_it_2():

... import pdb; pdb.set_trace()

... df['x'].mean()

>>> test_it_2()

... # Some stepping/poking around that isn't important

(Pdb) l

2307

2308 if we have an ndarray as a value, then simply perform the operation,

2309 otherwise delegate to the object

2310

2311 """

2312 -> delegate = self._values

2313 if isinstance(delegate, np.ndarray):

2314 # Validate that 'axis' is consistent with Series's single axis.

2315 self._get_axis_number(axis)

2316 if numeric_only:

2317 raise NotImplementedError('Series.{0} does not implement '

(Pdb) delegate.dtype

dtype('float32')

(Pdb) l

2315 self._get_axis_number(axis)

2316 if numeric_only:

2317 raise NotImplementedError('Series.{0} does not implement '

2318 'numeric_only.'.format(name))

2319 with np.errstate(all='ignore'):

2320 -> return op(delegate, skipna=skipna, **kwds)

2321

2322 return delegate._reduce(op=op, name=name, axis=axis, skipna=skipna,

2323 numeric_only=numeric_only,

2324 filter_type=filter_type, **kwds)

所以我们找到了麻烦点,但现在事情变得有些奇怪了:

(Pdb) op

(Pdb) op(delegate)

-9.0

(Pdb) delegate_64 = delegate.astype(np.float64)

(Pdb) op(delegate_64)

-9.000003749978807

(Pdb) delegate.mean()

-9.0000029

(Pdb) delegate_64.mean()

-9.0000037499788075

(Pdb) np.nanmean(delegate, dtype=np.float64)

-9.0000037499788075

(Pdb) np.nanmean(delegate, dtype=np.float32)

-9.0000029

请注意,delegate.mean()和np.nanmean输出-9.0000029类型为float32,而不是-9.0作为pandas nanmean.稍微探讨一下,你可以在pandas.core.nanops中找到pandas nanmean的来源.有趣的是,它实际上似乎应该首先匹配numpy.我们来看看pandas nanmean:

(Pdb) import inspect

(Pdb) src = inspect.getsource(op).split("\n")

(Pdb) for line in src: print(line)

@disallow('M8')

@bottleneck_switch()

def nanmean(values, axis=None, skipna=True):

values, mask, dtype, dtype_max = _get_values(values, skipna, 0)

dtype_sum = dtype_max

dtype_count = np.float64

if is_integer_dtype(dtype) or is_timedelta64_dtype(dtype):

dtype_sum = np.float64

elif is_float_dtype(dtype):

dtype_sum = dtype

dtype_count = dtype

count = _get_counts(mask, axis, dtype=dtype_count)

the_sum = _ensure_numeric(values.sum(axis, dtype=dtype_sum))

if axis is not None and getattr(the_sum, 'ndim', False):

the_mean = the_sum / count

ct_mask = count == 0

if ct_mask.any():

the_mean[ct_mask] = np.nan

else:

the_mean = the_sum / count if count > 0 else np.nan

return _wrap_results(the_mean, dtype)

这是bottleneck_switch装饰器的(短)版本:

import bottleneck as bn

...

class bottleneck_switch(object):

def __init__(self, **kwargs):

self.kwargs = kwargs

def __call__(self, alt):

bn_name = alt.__name__

try:

bn_func = getattr(bn, bn_name)

except (AttributeError, NameError): # pragma: no cover

bn_func = None

...

if (_USE_BOTTLENECK and skipna and

_bn_ok_dtype(values.dtype, bn_name)):

result = bn_func(values, axis=axis, **kwds)

用alt作为pandas nanmean函数调用它,所以bn_name是’nanmean’,这是从瓶颈模块中获取的attr:

(Pdb) l

93 result = np.empty(result_shape)

94 result.fill(0)

95 return result

96

97 if (_USE_BOTTLENECK and skipna and

98 -> _bn_ok_dtype(values.dtype, bn_name)):

99 result = bn_func(values, axis=axis, **kwds)

100

101 # prefer to treat inf/-inf as NA, but must compute the fun

102 # twice :(

103 if _has_infs(result):

(Pdb) n

> d:\anaconda3\lib\site-packages\pandas\core\nanops.py(99)f()

-> result = bn_func(values, axis=axis, **kwds)

(Pdb) alt

(Pdb) alt.__name__

'nanmean'

(Pdb) bn_func

(Pdb) bn_name

'nanmean'

(Pdb) bn_func(values, axis=axis, **kwds)

-9.0

假装bottleneck_switch()装饰器暂时不存在.我们实际上可以看到调用手动单步执行此函数(没有瓶颈)将获得与numpy相同的结果:

(Pdb) from pandas.core.nanops import _get_counts

(Pdb) from pandas.core.nanops import _get_values

(Pdb) from pandas.core.nanops import _ensure_numeric

(Pdb) values, mask, dtype, dtype_max = _get_values(delegate, skipna=skipna)

(Pdb) count = _get_counts(mask, axis=None, dtype=dtype)

(Pdb) count

900000.0

(Pdb) values.sum(axis=None, dtype=dtype) / count

-9.0000029

但是,如果你已经安装了瓶颈,那就永远不会被调用.相反,bottleneck_switch()装饰器反而突破了nanmean函数和瓶颈版本.这就是差异所在(有趣的是它在float64的情况下是匹配的):

(Pdb) import bottleneck as bn

(Pdb) bn.nanmean(delegate)

-9.0

(Pdb) bn.nanmean(delegate.astype(np.float64))

-9.000003749978807

据我所知,瓶颈仅用于速度.我假设他们正在使用他们的nanmean函数采用某种类型的快捷方式,但我没有对它进行过多考察(有关此主题的详细信息,请参阅@ ead的答案).您可以看到它的基准测试通常比numpy快一点:https://github.com/kwgoodman/bottleneck.显然,为这个速度付出的代价是精确的.

瓶颈实际上更快吗?

当然看起来像(至少在我的机器上).

In [1]: import numpy as np; import pandas as pd

In [2]: x=np.random.normal(-9.8,.05,size=900000)

In [3]: y_32 = x.astype(np.float32)

In [13]: %timeit np.nanmean(y_32)

100 loops, best of 3: 5.72 ms per loop

In [14]: %timeit bn.nanmean(y_32)

1000 loops, best of 3: 854 ?s per loop

对于pandas来说,在这里引入一个标志可能会很好(一个用于速度,另一个用于更好的精度,默认用于速度,因为那是当前的impl).一些用户更关心计算的准确性而不是它发生的速度.

HTH.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python实现数据恢复软件_pyinstaller还原python代码过程图解

这篇文章主要介绍了pyinstaller还原python代码过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下pyinstaller 的作用就是将python打包成对应平台的可执行文件。一般这种可执行文件的体积都比较大。我们可以…

android 截图 listview,Android屏幕及view的截图实例详解

Android屏幕及view的截图实例详解屏幕可见区域的截图整个屏幕截图的话可以用View view getWindow().getDecorView();public static Bitmap getNormalViewScreenshot(View view) {view.setDrawingCacheEnabled(true);view.buildDrawingCache();return view.getDrawingCache();}…

python指定位置写入文件_Python从文件中读取指定的行以及在文件指定位置写入

Python从文件中读取指定的行以及在文件指定位置写入 Python从文件中读取指定的行 如果想根据给出的行号, 从文本文件中读取一行数据, Python标准库linecache模块非常适合这个任务: 测试文件内容 : This is line 1. This is line 2. This is l…

华硕 x86 android,【华硕X79评测】学不会不收费 几步教你安装Android x86-中关村在线...

安装Android x86其实并不困难【中关村在线】华硕X79评测: 话说最近操作系统这个话题非常火爆。也许是借助于Windows 8消费者预览版的光芒,凡是与系统搭边的东西大家好像都喜欢与Windows 8进行比较。介于现在可以使用的系统众多,其中Android x…

r矢量球坐标系旋度_矢量与场论 | 场论

场的概念 | 方向导数与梯度 | 通量与散度 | 环量与旋度 | 典型矢量场 | 哈密顿算子场的概念1.场:如果在全部空间或部分空间里的每一点,都对应着某个物理量的一个确定的值,即在这个空间里确定了该物理量的一个场。(数量场/矢量场 、…

springboot用户管理系统_Springboot优秀开源项目

前言 作为一个开发人员来说,快速的熟悉一项技术就是去使用它.伟大的作家鲁迅先生曾说过:看别人视频不如自己敲代码!作为一个菜鸡开发,我平时也致力于收集各种大神的开源项目!接下来就给大家带来我绞尽乳汁为大家搜罗的几个开源的好项目吧!1. 基于springboot Vue 的人事管理系统…

转换背景色 html,html – CSS转换:淡化背景颜色,重置后

我有一个div列表,并允许我的用户通过发布新的内容动态添加一个新的。如果用户发布新内容,我想通过将新div的背景颜色淡化为另一种颜色,并将其淡出,从而在屏幕上突出显示。我很亲近我正在使用这个CSS来触发转换:.backgr…

第一次失效_又到审核季,内审员们,咱如何开好第一次会议?

导读作为一名企业的内审员,展开工作将从第一次会议开始,那么如何组织好第一次会议将是十分关键的,今天小编特地跟大家一起分享下首次会议召开的案例,手把手教你怎么成功召开首次会议:首次会议由审核组长主持。01 签到与…

python判断字符_Python判断字符串是否为字母或者数字(浮点数)

str为字符串s为字符串 str.isalnum() 所有字符都是数字或者字母 str.isalpha() 所有字符都是字母 str.isdigit() 所有字符都是数字 str.isspace() 所有字符都是空白字符、t、n、r 检查字符串是数字/浮点数方法 float部分 >> float(Nan) nan >> float(Nan) nan >…

疯狂动物消消乐html5游戏在线玩,疯狂动物消消乐免费

疯狂动物消消乐免费版这是一个移动端休闲益智手游,疯狂动物消消乐免费版主打消除了玩法,在疯狂动物消消乐免费版游戏当中玩家要经过种种形式移动游戏当中元素来到达相同种类消除了成功的目的。游戏介绍疯狂动物消消乐一款休闲类的消除游戏,全…

windows便签快捷键_win10电脑有哪些常用的快捷键?

十年八年都不怎么用的快捷键这里就不讲啦,全是常用的,而且用熟了之后你的电脑水平就会变高,至少别人看来是这样的啦♪(^∇^*)。windows键P键:打开小娜,可搜问题,可聊天,可语音调戏。小娜windows…

四川计算机专业大专哪所好,四川省计算机多媒体技术好的大专学校哪好

四川省计算机多媒体技术好的大专学校哪好?随着计算机多媒体技术越来越深入的与人们的生活联系在一起,开设计算机多媒体技术专业的学校也是越来越多,报考计算机多媒体技术专业的同学也是一年比一年多,可是计算机多媒体技术好的大专学校有哪些…

python pil_python PIL 图像处理

编辑推荐: 本文来自于jianshu,文章介绍了pil能处理的图片类型,matplotlib标准模式以及图像通道\几何变换\裁剪等相关内容 。 Image读出来的是PIL的类型,而skimage.io读出来的数据是numpy格式的 #Image和skimage读图片import Image as img import os from…

w7电脑蓝屏怎么解决_怎么解决0x0000007b电脑蓝屏 解决0x0000007b电脑蓝屏方法【详细步骤】...

电脑蓝屏死机报错 0x0000007b 是什么情况呢?0x0000007b电脑蓝屏通常情况是硬盘的存储控制器驱动加载错误导致故障。对于这种情况就要有相应解决措施,下面来看看具体解决方法。导致驱动加载错误的情况可能有以下三种情况:1.无法自动识别硬盘控制器&#…

判断二叉树是否是完全二叉树c语言_完全二叉树的节点数,你真的会算吗?

读完本文,你可以去力扣拿下如下题目:222.完全二叉树的节点个数-----------如果让你数一下一棵普通二叉树有多少个节点,这很简单,只要在二叉树的遍历框架上加一点代码就行了。但是,如果给你一棵完全二叉树,让…

怎样用计算机记账,仓管员怎么用电脑记账?简单实用的电脑操作方式一览!

仓库管理中,有很多的流水账需要进行记录,物品的收发,物品的采购等等,传统的仓库管理,多用人工方式等记录,效率相对较低,出现差错率相对较高,如今,多采用软件及电脑等方式…

免密登录关闭_微信最新提醒:这个设置再不关闭,你的微信账号就能被别人“免密登录”!...

哈喽大家好,我是你们的老朋友姗姗,每天与大家分享不一样的生活知识,阅读本文前,请您先点击上面的“姗姗时尚思”,再点击“关注”,这样您就可以继续免费收到文章了,希望可以多鼓励一下小编&#…

查看计算机用户修改密码时间,使用ldap语句查询某时间后没改密码的用户

经常使用Active Directory用户和计算机控制台的我们会发现,在左侧控制台树的最上面有一个“保存的查询”,通过新建查询可以看到可以通过图形界面创建一些简单的查询操作。那么我们如果有一些特殊的查询要做要怎么来实现呢。这里我们把《查询某个时间点后…

python连接oracle数据库_深入理解Python3.6连接Oracle数据库

Python3.6连接Oracle数据库的方法详解 本文实例讲述了Python3.6连接Oracle数据库的方法。分享给大家供大家参考,具体如下: 下载cx_Oracle模块模块: https://pypi.python.org/pypi/cx_Oracle/5.2.1#downloads 这里下载的是源码进行安装 [rooto…

rfid阅读器的主要任务_RFID阅读器(读写器)的应用领域及其如何使用?

RFID阅读器(读写器)的应用领域及其如何使用?来源:本站 | 作者:admin | 发表于:2018-05-25 | 浏览次数:2181首先来了解一下RFID系统的构成:①电子标签,由芯片和标签天线组成,通过电感偶合或电磁…