Effiziente Bestimmung, ob große sortierte numpy Array hat nur eindeutige Werte

Ich habe eine sehr große numpy Array und ich möchte es sortieren und testen, ob es einzigartig ist.

Ich bin mir der Funktion numpy.unique bewusst, aber es sortiert das Array noch einmal, um es zu erreichen.

  • So laden Sie mehrere Bilder in Django mit Dropzone für mehrere Bildfelder hoch
  • Lesen Inhalt Tarfile in Python - "Rückwärts suchen ist nicht erlaubt"
  • Vergleich des einzelnen Dataframe-Wertes mit vorherigen 10 in derselben Spalte
  • Django unicode aus dem Abfrageergebnis entfernen
  • Kann nicht scikit-lernen auf OS X installiert werden
  • Wie gibt man eine utf-8 String-Liste wie es in Python ist?
  • Der Grund, warum ich das Array a priori sortiere, ist, weil die zurückgegebenen Schlüssel aus der argsort Funktion verwendet werden, um ein anderes Array neu anzuordnen.

    Ich suche einen Weg, um beide zu tun ( argsort und einzigartiger Test) ohne die Notwendigkeit, das Array wieder zu sortieren.

    Beispielcode:

     import numpy as np import numpy.random # generating random arrays with 2 ^ 27 columns (it can grow even bigger!) slices = np.random.random_integers(2 ** 32, size = 2 ** 27) values = np.random.random_integers(2 ** 32, size = 2 ** 27) # get an array of keys to sort slices AND values # this operation takes a long time sorted_slices = slices.argsort() # sort both arrays # it would be nice to make this operation in place slices = slices[sorted_slices] values = values[sorted_slices] # test 'uniqueness' # here, the np.unique function sorts the array again if slices.shape[0] == np.unique(slices).shape[0]: print('it is unique!') else: print('not unique!') 

    Beide Arrays slices und values haben 1 Zeile und die gleiche (riesige) Anzahl von Spalten.

    Danke im Voraus.

    2 Solutions collect form web for “Effiziente Bestimmung, ob große sortierte numpy Array hat nur eindeutige Werte”

    Sie können überprüfen, ob zwei oder mehr gleiche Werte nebeneinander vorhanden sind (nicht eindeutige Werte in einem sortierten Array), indem sie ihre Differenz mit 0

     numpy.any(numpy.diff(slices) == 0) 

    Seien Sie sich bewusst, dass numpy wird zwei Zwischen-Arrays erstellen: eine mit den Unterschiedswerten, eine mit booleschen Werten.

    Hier ist ein Ansatz, der das slicing und anstelle der tatsächlichen Differenzierung nutzt, wir können einfach jedes Element gegen das vorherige vergleichen, ohne den Differenzierungswert zu berechnen,

     ~((slices[1:] == slices[:-1]).any()) 

    Runtime Test –

     In [54]: slices = np.sort(np.random.randint(0,100000000,(10000000))) # @Nils Werner's soln In [55]: %timeit ~np.any(np.diff(slices) == 0) 100 loops, best of 3: 18.5 ms per loop # @Marco's suggestion in comments In [56]: %timeit np.diff(slices).all() 10 loops, best of 3: 20.6 ms per loop # Proposed soln in this post In [57]: %timeit ~((slices[1:] == slices[:-1]).any()) 100 loops, best of 3: 6.12 ms per loop 
    Python ist die beste Programmiersprache der Welt.