我有一个长度为1024的值的向量g和一个大小为32的较小的向量f来定义bin边界。v和f按升序排序。我想返回一个向量数组,即长度为len(f)的[v_1,v_2,v_3,...],这样每个向量v_i都包含f_i和f_i + 1之间的g的索引。有没有一种NumPy方法可以做这样的事情而不涉及循环?
发布于 2016-09-15 11:14:44
您可以使用searchsorted查找f在g中的排序位置。它们给出了所需范围的下限和上界:
例如,
In [42]: g
Out[42]:
array([ 1, 11, 19, 20, 21, 32, 36, 41, 47, 53, 54, 55, 65, 66, 69, 74, 76,
87, 89, 94])
In [43]: f
Out[43]: [0, 10, 20, 50, 100]
In [44]: binedges = g.searchsorted(f)
In [45]: binedges
Out[45]: array([ 0, 1, 3, 9, 20])数组binedges提供了您需要的所有信息: bin k的索引范围是range(binedges[k], binedges[k+1])。
下面是如何在每个bin中创建索引的显式列表:
In [46]: rngs = [list(range(binedges[k], binedges[k+1])) for k in range(len(binedges)-1)]
In [47]: rngs
Out[47]: [[0], [1, 2], [3, 4, 5, 6, 7, 8], [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]]发布于 2016-09-15 06:25:14
首先要做的是:
import numpy as np假设您有自己的数据g
g = sorted((1e3 * np.random.random(1024)).astype(int))和你的垃圾桶f
f = sorted((1e3 * np.random.random(32)).astype(int))您可以使用numpy.digitize,它返回g的每个元素所属的f中的bin索引:
dg = np.digitize(g,f)生成的向量将包含不同大小的列表,因此您可能希望将其存储为列表:
for i in range(len(f)): v.append(np.argwhere(dg == i))https://stackoverflow.com/questions/39500218
复制相似问题