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.

  • Pyodbc Installationsfehler auf Ubuntu 16.04 mit Sql Server installiert
  • Kopieren / Einfügen mehrerer Elemente aus QTableView in pyqt4?
  • Wie schreibe ich eine 24-Bit-WAV-Datei in Python?
  • Thread-Synchronisation in Python
  • Was ist der Unterschied zwischen Größe und Zählung in Pandas?
  • Python: Warum ist __dict__ Attribut nicht in eingebauten Klasseninstanzen
  • 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.