2016-07-19 8 views
0

各要素が{0、..、K-1}から値をとることができる次元WXHのラベルマップが与えられたら、K番目のマップの各要素が1だけである次元KXW x Hのラベルテンソルを出力したいlabelmapの対応する値がKだった場合、現在私の実装は2つのforループを使用しており、非常に遅いです。Numpyのラベルマップからラベルテンソルの作成をスピードアップするには?

p_label = Labelmap with one channel 

label = np.zeros((K,p_label.shape[0], p_label.shape[1])) 
for i in xrange(p_label.shape[0]): 
     for j in xrange(p_label.shape[1]): 
      label[p_label[i,j],i,j] = 1 

ブロードキャストを使用してNumpyでこの操作を行うより良い方法はありますか?

+0

は 'p_label'部4dまたは2か? – hpaulj

答えて

2

ブロードキャストで==演算子を使用できます。例えば

In [19]: W = 5 

In [20]: H = 8 

In [21]: K = 10 

は、例えばp_labelを作成:

In [22]: p_label = np.random.randint(0, K, size=(W, H)) 

kvals単に含む配列[0、1、...、K-1]であります

In [23]: kvals = np.arange(K) 

kvals.reshape(-1, 1, 1)kvalsを形状(K、 1,1)。これは、==p_labelを使用して比較されます。ブロードキャストが適用されるので、比較の結果は形状(K、W、H)を持ちます。これは、必要な値のブール値の配列です。 .astype(int)は結果を整数配列に変換します。 (あなたはブール配列はあなたのために働くならばという削除することができます。)

In [24]: label = (p_label == kvals.reshape(-1, 1, 1)).astype(int) 

ここでは、元p_labelです。メモは、例えば、値0の位置:

In [25]: p_label 
Out[25]: 
array([[3, 3, 2, 6, 2, 2, 9, 3], 
     [1, 8, 1, 1, 4, 3, 7, 8], 
     [5, 9, 1, 0, 7, 2, 8, 0], 
     [1, 3, 5, 4, 6, 0, 9, 5], 
     [5, 7, 2, 0, 6, 4, 5, 3]]) 

label[0]p_label0ある位置における1です。

In [26]: label[0] 
Out[26]: 
array([[0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 1, 0, 0, 0, 1], 
     [0, 0, 0, 0, 0, 1, 0, 0], 
     [0, 0, 0, 1, 0, 0, 0, 0]]) 
1
Label[p_label, np.arange(p_label.shape[0])[:,None], np.arange(p_label.shape[1])] = 1 

互いに放送3つの索引アレイ。

==============================

lmap = np.arange(12).reshape(3,4) 
lbl = np.zeros((12,3,4),int) 
lbl[lmap,np.arange(3)[:,None],np.arange(4)] = 1 

In [5]: lbl 
Out[5]: 
array([[[1, 0, 0, 0], 
     [0, 0, 0, 0], 
     [0, 0, 0, 0]], 

     [[0, 1, 0, 0], 
     [0, 0, 0, 0], 
     [0, 0, 0, 0]], 

     ... 
     [[0, 0, 0, 0], 
     [0, 0, 0, 0], 
     [0, 0, 0, 1]]]) 
関連する問題