假设我在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
,其元素是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
中落入每个分区C = np.array([1,0,2,4,3])
的元素数量。在这个例子中,我们有
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
,它将完全符合我们的要求。请注意,返回的binning数组将具有最多0
计数,这意味着它还将输出缺失值的2
计数,在这种情况下为[0.05,0.1)
,对应于区间np.bincount(s)[1:]
# array([1, 0, 2, 4, 3])
:
qazxswpoi