2016-09-14 10 views
0

私は、長さ1024の値のベクトルgと、ビン境界を定義するより小さなベクトルfのサイズ32を持っています。 vおよびfは昇順にソートされます。それぞれのベクトルがgf_if_i + 1の間のインデックスを含むように、ベクトルの配列、すなわち長さがlen(f)[v_1,v_2,v_3,...]を返したいと思います。ループを伴わないようなことをする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)) 

あなたが返す​​を、使用することができますfのbinのインデックスeac gの時間要素が属する:

dg = np.digitize(g,f) 

得られたベクターは、あなたはそれがリストで保存したい場合がありますので、異なるサイズのリストが含まれているために起こっている:

for i in range(len(f)): v.append(np.argwhere(dg == i)) 
関連する問題