快速简单的一维和二维直方图

fast-histogram的Python项目详细描述


Travis StatusAppVeyor StatusCircleCI Statusasv

关于

有时你只想计算简单的一维或二维柱状图和常规的箱子。快。不 胡说。Numpy’s直方图函数是 多才多艺,可以处理例如非常规装箱,但是 多才多艺是以牺牲性能为代价的。

fast直方图迷你包旨在提供简单快速的 直方图函数,用于不影响性能的常规垃圾箱。不是这样的 任何复杂的东西-它只是实现一个简单的直方图算法 在C语言中保持简单。其目的是拥有快速但 同样坚固可靠。结果是一个一维直方图函数 是7-15倍于numpy.histogram的速度和二维直方图函数吗? 这比numpy.histogram2d快20-25倍。

要安装:

pip install fast-histogram

或者如果您使用conda,您可以改为:

conda install -c conda-forge fast-histogram

然后,fast_histogram模块提供两个函数: histogram1dhistogram2d

fromfast_histogramimporthistogram1d,histogram2d

示例

下面是一个将1000万个点合并成规则二维的例子 直方图:

In[1]:importnumpyasnpIn[2]:x=np.random.random(10_000_000)In[3]:y=np.random.random(10_000_000)In[4]:%timeit_=np.histogram2d(x,y,range=[[-1,2],[-2,4]],bins=30)935ms±58.4msperloop(mean±std.dev.of7runs,1loopeach)In[5]:fromfast_histogramimporthistogram2dIn[6]:%timeit_=histogram2d(x,y,range=[[-1,2],[-2,4]],bins=30)40.2ms±624µsperloop(mean±std.dev.of7runs,10loopseach)

(注意10_000_000在python 3.6语法中是可能的,在以前的版本中使用10000000

这里的版本快了20多倍!下图显示 作为上面所示的bin参数的数组大小的函数加速:

Comparison of performance between Numpy and fast-histogram

以及1D病例的结果,还有30个箱子。加速 二维情况始终在20-25倍之间,对于一维情况 小阵列为15倍,大阵列为7倍左右。

问答

为什么直方图函数不返回边缘呢?

计算和返回边可能看起来很简单,但是当计算10^5或更少元素的直方图时,它可以将速度降低几倍,因此不返回边是一个与性能相关的深思熟虑的决定。但是,如果需要,您可以使用numpy.linspace自己轻松计算边。

X包不是已经这样做了,但是更好吗?

很可能就是这样!如果这复制了另一个包,或者 如果可以用更聪明的方式使用numpy 性能提高,请打开一个问题,我将考虑否决 这个包裹:)

一个包含快速直方图函数的包(包括 并且可以计算其他的统计数据是 vaex,那就去看看 如果你需要更高级的功能!

二维柱状图与它们应该是的相比是否没有转置?

从技术上讲,没有“对”和“错”的方向-这里我们采用 给出与numpy一致的结果的约定,因此:

numpy.histogram2d(x,y,range=[[xmin,xmax],[ymin,ymax]],bins=[nx,ny])

结果应与:

fast_histogram.histogram2d(x,y,range=[[xmin,xmax],[ymin,ymax]],bins=[nx,ny])

为什么不直接把这个贡献给Numpy呢?

如上所述,numpy函数的通用性更强,因此它们不能 换成这里的那些。一个选择是签入numpy的函数 简单的案例并将其分派到函数,如这里的那些,或者添加 定期装箱专用功能。我希望我们能以某种形式在纽比得到这个 或者是另一个最终的目标,但现在,我们的目标是让这个包可以使用 这需要支持一系列的numpy版本。

为什么不用cython?

我最初在cython中实现了这个,但是发现我可以 直接进行C扩展可提高50%的性能。

使用numba怎么样?

我特别想让这个包尽可能容易安装, 虽然Numba是一个很好的包,但它是 安装在水蟒的外面并不容易。

这可以并行化吗?

在某些情况下,这可能得益于并行化。这个 最简单的解决方案可能是使用openmp,但是他的工作不可能全部完成 平台,所以它必须是可选的。

你不能用GPU来加快速度吗?

几乎可以肯定,虽然这里的目的是要有一个易于安装 和便携式软件包,引入gpu将影响 这些。

为什么要专门为此制作一个包?这是一个很小的功能

需要这样做的包可以简单地绑定它们自己的c扩展或 cython代码可以做到这一点,但将其作为 mini包是为了避免将纯python包变成 只因为需要计算快速直方图就需要编译。

我能帮忙吗?

是的,拜托!这不是一个完整的包裹,我欢迎 提出改进要求。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
相对于框架java窗口的鼠标位置错误   Java 8流peek api   java将数据附加到文件中   java使用ExoPlayer 2.8播放播放列表中的特定文件   JavaSpring国际化:如何动态设置语言环境值   java如何在mysql中实现两个表之间的两个关联   java在gradle可执行jar文件中包含运行时参数   surefire插件中的java maven多套测试套件   java试图理解堆分析以确定内存泄漏或所需的大量内存   java识别字符串有数字   数组如何解决错误“java.lang.ArrayIndexOutOfBoundsException:5”   java Swt文件对话框选择的文件太多?   java此登录代码易受SQL注入攻击吗?   Java[3]中的文件<identifier>预期编译错误   java如何在spring webflux中发送列表   jar中未找到java文件异常   如何在java中合并2D数组?   java如何评测本机JNI库