假设我在间隔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
有没有一种方法可以不使用循环?
答案 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)