2016-11-24 3 views
0

labels配列を置換後に割り当てたいと考えています。私は以下のようなコードを使用しています。置換後の配列の割り当て

np.random.seed(42) 
labels = np.zeros((10,1),dtype=int) 
idx = np.random.permutation(len(labels)) 
labels[idx][1:5] = np.random.randint(0,10,(4,1)) 

しかし、以下に示すように、ラベルはまだゼロであり、何も割り当てられていません。私は、ラベル[idx]パートがコピーを作成し、割り当てられているものを想像することができます。これを回避するには?

labels 
>>> array([[0], 
     [0], 
     [0], 
     [0], 
     [0], 
     [0], 
     [0], 
     [0], 
     [0], 
     [0]]) 

必要な出力は、このでした:

for i,j in enumerate(idx2): 
    labels[idx[j]] = a[i] 

labels 
>>> array([[7], 
    [2], 
    [0], 
    [0], 
    [0], 
    [6], 
    [0], 
    [4], 
    [0], 
    [0]]) 

答えて

0

次のスニペットは、私の質問に答え:

idx2 = np.argsort(idx) 
labels[1:5] = a 

labels[idx2] 

キーが元の順列への置換からのマッピングを見つけることでした。どちらがnp.argsort(idx)でしたか。

+0

なぜ私はあなたがインデックスと値の二重ランダムを使用していたのか理解できませんでした。 – hpaulj

+0

idxがランダム置換を行う場合、argsort部分はそれを通常の順序に戻します。元の順序に戻ってマッピングされる。小さなサンプルでそれをチェックしてください。 'np.random.permutation(5)' –

1
In [207]: idx 
Out[207]: array([5, 8, 3, 7, 9, 1, 6, 0, 4, 2]) 
In [208]: x=np.random.randint(0,10,(10,1)) 
In [209]: x 
Out[209]: 
array([[5], 
     [7], 
     [4], 
     [4], 
     [9], 
     [6], 
     [2], 
     [1], 
     [9], 
     [9]]) 
In [210]: labels[idx]=x 
In [211]: labels 
Out[211]: 
array([[1], 
     [6], 
     [9], 
     [4], 
     [9], 
     [5], 
     [2], 
     [4], 
     [7], 
     [9]]) 

idxのようなインデックスを使用している場合、あなたはlabels[idx]ことであるため、labels[idx][:5] = ....動作しませんを行う

labels[idx] = ... 

をしなければなりませんそれ自身がコピーを作成します。

labels[:5][idx[:5]] = ...は、[:5]がビューを作成するため、動作するはずです。

訂正:私はコピー対ビューのドキュメントを見直すことをお勧めしたい

labels[:5][np.random.randint(0,5,5)]=np.arange(5)[:,None] 

必要に応じて、高度なインデックス対基本。

+0

'IndexError:インデックス7は、軸5のサイズが5の範囲外です。': 'idx [:5] 'は長さ5に制限されていると仮定しています。 'labels'は10の長さです。 –

+0

はい、私は 'idx [:5]'部分をテストしませんでした。私が作ろうとしていたのは、最初にスライスすることです。 – hpaulj

+0

@hpauljあなたの答えは常に正確で文書化されていますが、なぜpep8に従わないのですか? –

0

これはどういう意味ですか?

labels = np.zeros((10,1),dtype=int) 
idx = np.random.permutation(len(labels)) 
pool = np.random.randint(0,10,(4,1)) 
for i in range(4): 
    labels[i] = pool[i] 
print labels 
+0

コード内のどこでも 'idx'を使用していません。 –

+0

idxは長さ10のランダム置換です。 ラベル[idx]はラベルを返しますが、順序が変更されています(つまり、インデックス0,1,2,3 ...の代わりに7,3,9、 1 ...) しかし、ラベルはゼロになるだけです。では、インデックスを変更することで何を得るのですか?私に理解を助ける。 – SeeDerekEngineer

+0

ラベルは、データが 'idx'と混在している機械学習の問題です。だから、私は元のフォーマットのラベルが必要です。私の例は、実際の問題を大幅に単純化したものです。 –