快速简单的一维和二维直方图
fast-histogram的Python项目详细描述
关于
有时你只想计算简单的一维或二维柱状图和常规的箱子。快。不 胡说。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模块提供两个函数: histogram1d和histogram2d:
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参数的数组大小的函数加速:
以及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包变成 只因为需要计算快速直方图就需要编译。
我能帮忙吗?
是的,拜托!这不是一个完整的包裹,我欢迎 提出改进要求。