arrays - 将数组拆分为数量相等的容器

标签 arrays numpy scipy vectorization binning

我有一个包含 N 个元素的数组(未排序)。我想保留 N 的原始顺序,但不是实际的元素,我希望它们有自己的 bin 编号,其中 N 被分成 m 个相等(如果 N 可被 m 整除)或几乎相等的 bin (N 不能被 m 整除)值。我需要一个矢量化解决方案(因为 N 相当大,所以标准 python 方法效率不高)。 scipy 或 numpy 中有什么可以做到这一点吗?

e.g.
N = [0.2, 1.5, 0.3, 1.7, 0.5]
m = 2
Desired output: [0, 1, 0, 1, 0]

我查看了 numpy.histogram,但它没有给我不等间距的垃圾箱。

最佳答案

本文中列出的是一种基于 NumPy 的向量化方法,其思想是使用 np.searchsorted 为输入数组的长度创建等距索引。 - 这是实现 -

def equal_bin(N, m):
    sep = (N.size/float(m))*np.arange(1,m+1)
    idx = sep.searchsorted(np.arange(N.size))
    return idx[N.argsort().argsort()]

示例运行时对每个容器进行容器计数以验证结果 -

In [442]: N = np.arange(1,94)

In [443]: np.bincount(equal_bin(N, 4))
Out[443]: array([24, 23, 23, 23])

In [444]: np.bincount(equal_bin(N, 5))
Out[444]: array([19, 19, 18, 19, 18])

In [445]: np.bincount(equal_bin(N, 10))
Out[445]: array([10,  9,  9, 10,  9,  9, 10,  9,  9,  9])
<小时/>

这是另一种使用 linspace 来创建可用作索引的等距数字的方法,如下所示 -

def equal_bin_v2(N, m):
    idx = np.linspace(0,m,N.size+0.5, endpoint=0).astype(int)
    return idx[N.argsort().argsort()]  

示例运行 -

In [689]: N
Out[689]: array([ 0.2,  1.5,  0.3,  1.7,  0.5])

In [690]: equal_bin_v2(N,2)
Out[690]: array([0, 1, 0, 1, 0])

In [691]: equal_bin_v2(N,3)
Out[691]: array([0, 1, 0, 2, 1])

In [692]: equal_bin_v2(N,4)
Out[692]: array([0, 2, 0, 3, 1])

In [693]: equal_bin_v2(N,5)
Out[693]: array([0, 3, 1, 4, 2])

关于arrays - 将数组拆分为数量相等的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40894129/

相关文章:

python - pandas numpy matplotlib 溢出错误 : date value out of range

python - 将字符串添加到字母python的末尾

python-3.x - 如何在标志从 0 变为 1 之前和之后提取行

python - Python 中的多元正态性检验

python - scipy.special.binom 和 scipy.misc.comb 有什么区别?

javascript - Jquery - 将数组值分配给下拉列表

c# - 从未知类返回字符串

python - 德莱尼三角剖分的欧几里德距离 - Scipy

c - C中指向字符串数组的指针

c# - 为什么我的 C# 代码不能按预期工作(数组转换,新手)