numpy で割り当てを取得する簡単な方法は、次を使用することnp.digitize
です。
http://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html
結果の割り当てをグループに分割する必要があります。x
ory
が多次元の場合、最初に配列を平坦化する必要があります。次に、一意のビン割り当てを取得し、それらを組み合わせて反復処理して、割り当てnp.where
をグループに分割します。ビンの数がビン化する必要がある要素の数よりもはるかに少ない場合、これはおそらく高速になります。
特定の問題について微調整/詳細化する必要があるやや些細な例として(ただし、うまくいけば、numpy ソリューションを使い始めるのに十分です):
In [1]: import numpy as np
In [2]: x = np.random.normal(size=(50,))
In [3]: b = np.linspace(-20,20,50)
In [4]: assign = np.digitize(x,b)
In [5]: assign
Out[5]:
array([23, 25, 25, 25, 24, 26, 24, 26, 23, 24, 25, 23, 26, 25, 27, 25, 25,
25, 25, 26, 26, 25, 25, 26, 24, 23, 25, 26, 26, 24, 24, 26, 27, 24,
25, 24, 23, 23, 26, 25, 24, 25, 25, 27, 26, 25, 27, 26, 26, 24])
In [6]: uid = np.unique(assign)
In [7]: adict = {}
In [8]: for ii in uid:
...: adict[ii] = np.where(assign == ii)[0]
...:
In [9]: adict
Out[9]:
{23: array([ 0, 8, 11, 25, 36, 37]),
24: array([ 4, 6, 9, 24, 29, 30, 33, 35, 40, 49]),
25: array([ 1, 2, 3, 10, 13, 15, 16, 17, 18, 21, 22, 26, 34, 39, 41, 42, 45]),
26: array([ 5, 7, 12, 19, 20, 23, 27, 28, 31, 38, 44, 47, 48]),
27: array([14, 32, 43, 46])}
numpy 配列の平坦化と非平坦化の処理については、http:
//docs.scipy.org/doc/numpy/reference/generated/numpy.unravel_index.htmlを参照してください。
http://docs.scipy.org/doc/numpy/reference/generated/numpy.ravel_multi_index.html