假设我有一组分区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
计数,这意味着它还将输出 0
的计数对于缺失值,2
在本例中,对应于区间 [0.05,0.1)
:
np.bincount(s)[1:]
# array([1, 0, 2, 4, 3])
关于python - 计算每个 bin 中有多少个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54962682/