Wie kann man zufällig zufällig zwischen gleichen Werten werden?

Sagen Sie, Sie haben einen numpy Vektor [0,3,1,1,1] und Sie laufen argsort Sie erhalten [0,2,3,4,1] aber alle sind die gleichen! Was ich will, ist ein effizienter Weg, um Indizes gleicher Werte zu mischen. Jede Idee, wie man das ohne eine while-Schleife mit zwei Indizes auf dem sortierten Vektor macht?

 numpy.array([0,3,1,1,1]).argsort() 

  • Warum hat meine Farbleiste Zeilen dazu?
  • Wie kann ich Code in Python neu ausführen?
  • Kann ich die Argumente einer Sellerie-Aufgabe bekommen, wenn ich nur die Aufgabe-ID habe?
  • Python-Unicode-Konsolenunterstützung unter Windows
  • Wie man Diagrammbilder als Subplots mit benutzerdefinierter Größe mit Plotly in Python zu zeichnen
  • Konvertieren Sie int in str, während in __getitem__ Python 2.7
  • 2 Solutions collect form web for “Wie kann man zufällig zufällig zwischen gleichen Werten werden?”

    Verwenden Sie lexsort : np.lexsort((b,a)) bedeutet Sortieren nach a , dann mit b

     >>> a array([0, 3, 1, 1, 1]) >>> b=np.random.random(a.size) >>> b array([ 0.00673736, 0.90089115, 0.31407214, 0.24299867, 0.7223546 ]) >>> np.lexsort((b,a)) array([0, 3, 2, 4, 1]) >>> a.argsort() array([0, 2, 3, 4, 1]) >>> a[[0, 3, 2, 4, 1]] array([0, 1, 1, 1, 3]) >>> a[[0, 2, 3, 4, 1]] array([0, 1, 1, 1, 3]) 

    Dies ist ein bisschen ein Hack, aber wenn Ihr Array Integers enthält, können Sie nur zufällige Werte hinzufügen und das Ergebnis hinzufügen. np.random.rand gibt Ihnen Ergebnisse in [0, 1) so in diesem Fall sind Sie garantiert die Aufrechterhaltung der Bestellung für nicht identische Elemente.

     >>> import numpy as np >>> arr = np.array([0,3,1,1,1]) >>> np.argsort(arr + np.random.rand(*arr.shape)) array([0, 4, 3, 2, 1]) >>> np.argsort(arr + np.random.rand(*arr.shape)) array([0, 3, 4, 2, 1]) >>> np.argsort(arr + np.random.rand(*arr.shape)) array([0, 3, 4, 2, 1]) >>> np.argsort(arr + np.random.rand(*arr.shape)) array([0, 2, 3, 4, 1]) >>> np.argsort(arr + np.random.rand(*arr.shape)) array([0, 2, 3, 4, 1]) >>> np.argsort(arr + np.random.rand(*arr.shape)) array([0, 4, 2, 3, 1]) 

    Hier sehen wir, dass Index 0 immer zuerst im argsort Ergebnis ist und Index 1 zuletzt ist, aber der Rest der Ergebnisse ist in einer zufälligen Reihenfolge.

    Im Allgemeinen kannst du zufällige Werte generieren, die von np.diff(np.sort(arr)).max() , aber du kannst irgendwann in Präzisionsprobleme laufen.

    Python ist die beste Programmiersprache der Welt.