跳转到主要内容

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

项目描述

CI Status asv PyPI release

关于

有时你只想使用常规的直方图进行简单的1D或2D直方图计算。快速。没有废话。《Numpy》的直方图功能非常灵活,可以处理例如非均匀分箱,但这种灵活性是以性能为代价的。

fast-histogram 小型包旨在提供简单且快速的常规直方图功能,而不会牺牲性能。它不做任何复杂的事情 - 它只是用C语言实现了一个简单的直方图算法,并保持其简单性。目标是拥有快速、健壮且可靠的函数。结果是这里有一个一维直方图函数,比 numpy.histogram7-15倍,还有一个二维直方图函数,比 numpy.histogram2d20-25倍

安装

pip install fast-histogram

或者如果你使用conda,你可以这样做

conda install -c conda-forge fast-histogram

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

from fast_histogram import histogram1d, histogram2d

示例

这里是一个将1000万个点分箱到常规2D直方图的例子

In [1]: import numpy as np

In [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)
935 ms ± 58.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [5]: from fast_histogram import histogram2d

In [6]: %timeit _ = histogram2d(x, y, range=[[-1, 2], [-2, 4]], bins=30)
40.2 ms ± 624 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

(请注意,在Python 3.6语法中, 10_000_000 是可能的,在旧版本中使用 10000000 代替)

这里的版本比20倍快!以下图表显示了上述分箱参数的数组大小随时间的变化速度

Comparison of performance between Numpy and fast-histogram

以及一维情况的结果,也使用了30个分箱。二维情况的速度提升始终在20-25倍之间,一维情况从小型数组中的15倍到大型数组中的约7倍。

问答

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

计算并返回边缘似乎很简单,但当计算10^5个或更少的元素的直方图时,这可能会使速度降低几个数量级,因此不返回边缘是关于性能的故意决定。不过,如果需要,您可以轻松地使用 numpy.linspace 自己计算边缘。

包X难道已经做了这个,而且做得更好吗?

这完全可能是真的!如果这重复了另一个包,或者如果可以使用Numpy以更智能的方式使用以获得相同的效果,请提出一个问题,我会考虑弃用这个包:)

一个包含快速直方图函数(包括多维直方图)并可以计算其他统计量的包是 vaex,所以如果您需要更高级的功能,请查看那里!

2D直方图与应有的直方图没有转置吗?

实际上没有“正确”和“错误”的方向——在这里,我们采用与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,但就目前而言,目标是让需要支持一系列Numpy版本的包可以使用这个功能。

为什么不使用Cython?

我最初用Cython实现了这个功能,但发现直接使用C扩展可以提升50%的性能。

关于使用Numba呢?

我特别希望尽可能简化这个包的安装,虽然Numba是一个很棒的包,但它在Anaconda之外安装并不简单。

这能并行化吗?

在特定情况下,这可能受益于并行化。最简单的解决方案可能是使用OpenMP,但这在所有平台上都可能不适用,所以它需要是可选的。

您能通过使用GPU来使其更快吗?

几乎肯定可以,但这里的目的是使其易于安装和便携,引入GPU将影响这两者。

为什么要为这个功能专门创建一个包?这只是一个非常小的功能。

需要这个功能的包可以简单地捆绑自己的C扩展或Cython代码来完成这个任务,但发布这个迷你包的主要动机是避免因为需要快速直方图而将纯Python包转换为需要编译的包。

我能贡献吗?

当然可以!这不是一个完整的包,我欢迎拉取请求来改进它。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪一个,请了解更多关于安装包的信息。

源分发

fast_histogram-0.14.tar.gz (47.5 kB 查看散列)

上传时间

构建分发

fast_histogram-0.14-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (23.0 kB 查看哈希值)

上传时间 PyPy manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

fast_histogram-0.14-cp39-abi3-win_amd64.whl (24.1 kB 查看哈希值)

上传时间 CPython 3.9+ Windows x86-64

fast_histogram-0.14-cp39-abi3-win32.whl (21.3 kB 查看哈希值)

上传时间 CPython 3.9+ Windows x86

fast_histogram-0.14-cp39-abi3-musllinux_1_1_x86_64.whl (43.6 kB 查看哈希值)

上传时间 CPython 3.9+ musllinux: musl 1.1+ x86-64

fast_histogram-0.14-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (55.5 kB 查看哈希值)

上传时间 CPython 3.9+ manylinux: glibc 2.17+ ARM64

fast_histogram-0.14-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (55.4 kB 查看哈希值)

上传时间 CPython 3.9+ manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

fast_histogram-0.14-cp39-abi3-macosx_11_0_arm64.whl (20.6 kB 查看哈希值)

上传时间 CPython 3.9+ macOS 11.0+ ARM64

fast_histogram-0.14-cp39-abi3-macosx_10_9_x86_64.whl (21.6 kB 查看哈希值)

上传时间 CPython 3.9+ macOS 10.9+ x86-64

由...