2016-11-24 4 views
0

Ich möchte mein labels Array nach der Permutation zuweisen. Ich verwende einen Code ähnlich wie unten.Array nach Permutation zuweisen

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)) 

Wie jedoch unten zu sehen ist, sind die Beschriftungen immer noch Null und es wurde nichts zugewiesen. Ich kann mir nur vorstellen, dass der labels [idx] -Teil eine Kopie erstellt und das was zugewiesen wird. Wie umgehe ich das?

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

die erforderliche Ausgabe war:

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

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

Antwort

0

Der folgende Ausschnitt beantwortet meine Frage:

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

labels[idx2] 

Der Schlüssel der Abbildung von der Permutation wieder auf die ursprüngliche Permutation zu finden war. Was ist np.argsort(idx) tat.

+0

Ich konnte nicht herausfinden, warum Sie die doppelte zufällige - von Index und Wert. – hpaulj

+0

Wenn das Idx die zufällige Permutation durchführt, setzt der Argsort-Teil es in der normalen Reihenfolge zurück. d.h. die Zuordnung zurück zur ursprünglichen Reihenfolge. schau es dir mit einer kleinen Probe an. 'n.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]]) 

Wenn ein Index wie idx verwenden, können Sie

labels[idx] = ... 

Doing labels[idx][:5] = .... nicht funktioniert, weil labels[idx] zu tun haben, durch erstellt selbst eine Kopie.

labels[:5][idx[:5]] = ... sollte funktionieren, denn [:5] erstellt eine Ansicht.

Korrektur:

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

Bei Bedarf würde ich vorschlagen Dokumentation vs Kopien auf Ansichten der Überprüfung und grundlegende vs Indexierung.

+0

'IndexError: Index 7 ist außerhalb der Grenzen für Achse 0 mit der Größe 5': Sie gehen davon aus, dass 'idx [: 5]' auf Länge 5 beschränkt wäre, was nicht ist. "Labels" hat eine Länge von zehn. –

+0

Ja, ich habe den 'idx [: 5]' Teil nicht getestet. Der Punkt, den ich versuchte zu machen, ist, dass das Schneiden zuerst funktioniert. – hpaulj

+0

@hpaulj deine Antworten sind immer sehr präzise und dokumentiert, aber warum folgst du nicht pep8? –

0

Meinst du das?

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

Sie haben 'idx' nirgends in Ihrem Code verwendet. –

+0

idx ist eine zufällige Permutation der Länge 10. labels [idx] gibt labels zurück, aber mit der Reihenfolge geändert (dh statt index 0,1,2,3 ... ist es jetzt 7,3,9, 1 ...) Aber Etiketten sind nichts als Nullen zu beginnen. Was erhoffst du dir, wenn du die Indexierung änderst? Hilf mir, zu verstehen. – SeeDerekEngineer

+0

Die Etiketten stammen aus einem maschinellen Lernproblem, bei dem die Daten mit "idx" gemischt werden. Am Ende brauche ich die Etiketten in ihrem ursprünglichen Format. Mein Beispiel ist eine große Vereinfachung des eigentlichen Problems. –