2016-09-14 70 views
0

我有一個長度爲1024的值的矢量g,以及一個大小爲32的小矢量f,用於定義bin邊界。 vf按升序排列。我想要返回一組載體,即長度爲len(f)[v_1,v_2,v_3,...],使得每個載體v_i包含在f_if_i + 1之間的g的索引。有沒有NumPy的方式來做這樣的事情,不涉及循環?numpy binning:如何獲得滿足謂詞的數組索引

回答

1

您可以使用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給你,你需要的所有信息:指標爲斌k範圍爲range(binedges[k], binedges[k+1])

這裏是你如何可以創建在每個箱指數的顯式列表:

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]] 
+0

感謝。這很好。 – LostInTheFrequencyDomain

0

首先第一件事情:

import numpy as np 

假設你有你的數據g

g = sorted((1e3 * np.random.random(1024)).astype(int)) 

和你的垃圾箱f

f = sorted((1e3 * np.random.random(32)).astype(int)) 

可以使用​​,其返回bin索引f其中eac的g^h元素屬於:

dg = np.digitize(g,f) 

所得載體將包含不同大小的列表,所以你可能要保存它是一個列表:

for i in range(len(f)): v.append(np.argwhere(dg == i))