2017-01-18 12 views
2

私は4つのクラスで巨大な訓練データセットを持っています。これらのクラスは、非連続的にラベル付けされています。順次ニューラルネットワークを適用できるようにするには、クラス内の一意の値が連続するように、クラスを再ラベル付けする必要があります。さらに、スクリプトの終わりに、私はそれらを古い価値に戻し直す必要があります。NumPy配列を連続した番号にベクトル化して戻すこと

私はループでそれらを再ラベル付けする方法を知っている:

def relabel(old_classes, new_classes): 
    indexes=[np.where(old_classes ==np.unique(old_classes)[i]) for i in range(len(new_classes))] 
    for i in range(len(new_classes)): 
     old_classes [indexes[i]]=new_classes[i] 
    return old_classes 

>>> old_classes = np.array([0,1,2,6,6,2,6,1,1,0]) 
>>> new_classes = np.arange(len(np.unique(old_classes))) 
>>> relabel(old_classes,new_classes) 
array([0, 1, 2, 3, 3, 2, 3, 1, 1, 0]) 

しかし、これは素敵なコーディングではありません、それは時間のかなり多くを取ります。

この再ラベル付けをベクトル化する方法はありますか?


明確にするために、私はまた戻って自分の古い値にそれらを再ラベル付けできるようにしたい:

>>> relabeled_classes=np.array([0, 1, 2, 3, 3, 2, 3, 1, 1, 0]) 
>>> old_classes = np.array([0,1,2,6]) 
>>> relabel(relabeled_classes,old_classes) 
array([0,1,2,6,6,2,6,1,1,0]) 

答えて

5

我々は、これらのユニークな連番ID /タグを取得するためにnp.uniqueとオプションの引数return_inverseを使用することができます、のようなので、 - バック取得するために、unq_tagsunq_arr

unq_arr, unq_tags = np.unique(old_classes,return_inverse=1) 

インデックス -

old_classes_retrieved = unq_arr[unq_tags] 

サンプル実行 -

In [69]: old_classes = np.array([0,1,2,6,6,2,6,1,1,0]) 

In [70]: unq_arr, unq_tags = np.unique(old_classes,return_inverse=1) 

In [71]: unq_arr 
Out[71]: array([0, 1, 2, 6]) 

In [72]: unq_tags 
Out[72]: array([0, 1, 2, 3, 3, 2, 3, 1, 1, 0]) 

In [73]: old_classes_retrieved = unq_arr[unq_tags] 

In [74]: old_classes_retrieved 
Out[74]: array([0, 1, 2, 6, 6, 2, 6, 1, 1, 0]) 
+0

しかし、私はまた、彼らの古い値にそれらをバックラベルを変更するためにこれを使用することができますか? –

+0

@WilmarvanOmmeren試しましたか?これはあなたが 'relabel'関数で習得しているものと同じラベルになります。 – Divakar

+0

はい、私はそれらを連続していない連続するものにラベルを付け直すと動作します。しかし、私が古い値に戻ってラベル付けをしたいときはそうではありません。ソーラー、私はもっと明確に私の例を広げた! –

関連する問題