2017-07-29 4 views
1

scipy.ndimage.labelを使用する大きな配列(3000 x 3000)で作業しています。戻り値は、3403個のラベルとラベル付き配列です。私はこれらのラベルのインデックスを、例えば、ラベル1については、ラベル付き配列の行と列を知っておく必要があります。 だから、基本的にこのScipyでラベル付けされた配列からnp.whereから離れたインデックスの計算が速くなります

a[0] = array([[1, 1, 0, 0], 
       [1, 1, 0, 2], 
       [0, 0, 0, 2], 
       [3, 3, 0, 0]]) 


indices = [np.where(a[0]==t+1) for t in range(a[1])] #where a[1] = 3 is number of labels. 

print indices 
[(array([0, 0, 1, 1]), array([0, 1, 0, 1])), (array([1, 2]), array([3, 3])), (array([3, 3]), array([0, 1]))] 

ように、私は上記のように、すべての3403枚のラベルのためのインデックスのリストを作成したいと思います。上記の方法は遅いようです。私はジェネレータを使ってみましたが、改善があるようには見えません。

効率的な方法はありますか?

+0

私たちにあなたの仕事のルーピーソリューションを教えてください。 – Divakar

+0

@Divakar indices = m [0]がラベル付き配列であり、m [1]がラベル数(3403)である場合、範囲[m [1]]のtの[np.where(m [0] == t + 1)ここに)。 – Gargantua89

+0

質問に追加してください。サンプルデータも見ていただければ幸いです。 – Divakar

答えて

0

効率を上げるというアイデアは、ループ内で一度作業を最小限に抑えることです。ラベルごとに要素の数が可変であれば、ベクトル化された方法は不可能です。だから、心の中でこれらの要因と、ここに一つの解決策だ -

a_flattened = a[0].ravel() 
sidx = np.argsort(a_flattened) 
afs = a_flattened[sidx] 
cut_idx = np.r_[0,np.flatnonzero(afs[1:] != afs[:-1])+1,a_flattened.size] 
row, col = np.unravel_index(sidx, a[0].shape) 
row_indices = [row[i:j] for i,j in zip(cut_idx[:-1],cut_idx[1:])] 
col_indices = [col[i:j] for i,j in zip(cut_idx[:-1],cut_idx[1:])] 

サンプル入力、出力 -

In [59]: a[0] 
Out[59]: 
array([[1, 1, 0, 0], 
     [1, 1, 0, 2], 
     [0, 0, 0, 2], 
     [3, 3, 0, 0]]) 

In [60]: a[1] 
Out[60]: 3 

In [62]: row_indices # row indices 
Out[62]: 
[array([0, 0, 1, 2, 2, 2, 3, 3]), # for label-0 
array([0, 0, 1, 1]),    # for label-1 
array([1, 2]),     # for label-2  
array([3, 3])]     # for label-3 

In [63]: col_indices # column indices 
Out[63]: 
[array([2, 3, 2, 0, 1, 2, 2, 3]), # for label-0 
array([0, 1, 0, 1]),    # for label-1 
array([3, 3]),     # for label-2 
array([0, 1])]     # for label-3 

row_indicescol_indicesオフ最初の要素は、予想される出力されます。それぞれの最初のグループは0-thの領域を表しているため、それらの領域をスキップすることもできます。

関連する問題