2016-03-23 5 views
2

Ich habe einen Vektor mit 0s und 1s. Ich möchte einen neuen Vektor mit umgeordneten Werte haben, während ich einen anderen Vektor mit einer Zuordnungsregel haben:Numerischen Vektor nach Mapping-Regel umordnen

Beispiel:

input: 1,0,0,1 
rule: 0,3,2,1 
after mapping:1,1,0,0 

Die Zuordnungsvektor für jeden Index Index der Wert in dem neuen Vektor an, der bestimmt, kann gefunden werden.

Wie mache ich das?

+1

Ich verstehe die Zuordnungsregel nicht. Meinst du 0, 3, 1, 2? – kazemakase

+2

'a = np.asarray ([1,0,0,1]); b = np.asarray ([0,3,1,2]); a [b] ' – Bort

+0

@Bort Das macht nicht, was das OP will: siehe meine Antwort. – FTP

Antwort

0

Nehmen wir an, a ist das ursprüngliche Array und b ist die Zuordnungsregel. Da die Zuordnungsregel sagt "bei welchem ​​Index in dem neuen Vektor der Wert gefunden werden kann", müssen Sie a[c] berechnen, wobei c der inverse der Permutation b ist. Die Berechnung der inversen Permutation ist addressed in detail elsewhere, so dass ich von dort eine der Lösungen holen werden:

c = np.zeros(b.size, b.dtype) 
c[b] = np.arange(b.size) 
new_array = a[c] 

Beispiel: Wenn ein [7, 8, 9] und b [1, 2, 0], dies gibt [9, 7, 8]. Lassen Sie uns:

  • 7 ging auf Position 1,
  • 8 ging auf Position 2,
  • 9 gingen 0

Das Ergebnis ist korrekt zu positionieren.


Wenn Sie a[b] tun, wie von Bort vorgeschlagen, wäre das Ergebnis [8, 9, 7], die anders ist. In der Tat, in dieser Version die Einträge von b sagen, wo die Zahlen von kam in der ursprünglichen Anordnung:

  • 8 kam von Position 1
  • 9 von der Position kam 2
  • 7 kam von Position 0

die Angelegenheit zu verwirren, das Beispiel, das Sie ist gab eine Permutation, die auf den inversen gleich ist, so ist der Unterschied verloren.

Verwandte Themen