计算每个箱中有多少个值

时间:2019-03-02 20:27:54

标签: python arrays numpy partition

假设我在间隔P上有一组分区[0,1)P的长度为N。例如:

P = np.array([0,0.05,0.1,0.3,0.7,1])

[0,1)划分为以下间隔:

[0,0.05), [0.05,0.1), [0.1,0.3), [0.3,0.7) , [0.7,1)

我在U上有另一个长度K的数组[0,1),其元素是u+i/K的{​​{1}},其中i = 0,...,K-1。例如

0<u<1/K

我想计算U = np.array([0.03,0.13,0.23,0.33,0.43,0.53,0.63,0.73,0.83,0.93]) 中属于每个分区U的元素的数量。在此示例中,我们有

j = 0, ..., N-1

有没有一种方法可以不使用循环?

1 个答案:

答案 0 :(得分:1)

一种方法是使用np.searchsorted获取索引,在该索引中应将U中的元素插入P中以保持顺序,然后使用np.bincount获取一个计数每个索引的出现次数:

np.bincount(np.searchsorted(P,U))[1:]
# array([1, 0, 2, 4, 3])

或使用np.digitize假定垃圾箱总是单调增加:

np.bincount(np.digitize(U,P))[1:]
# array([1, 0, 2, 4, 3])

详细信息

P = np.array([0,0.05,0.1,0.3,0.7,1])
U = np.array([0.03,0.13,0.23,0.33,0.43,0.53,0.63,0.73,0.83,0.93])

如前所述,np.searchsorted将返回将U中的元素插入P中的索引,以便后者保持有序:

s = np.searchsorted(P,U)
# array([1, 3, 3, 4, 4, 4, 4, 5, 5, 5])

我们接下来要做的是计算每个索引的出现次数。为此,我们可以使用np.bincount,它可以完全满足我们的要求。请注意,返回的合并数组最多有np.amax(x)+1个计数,这意味着它也会输出0的缺失值计数,在这种情况下为2,它对应于间隔{ {1}}:

[0.05,0.1)