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.

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.

  • Wie man per Schlüssel (alphabetisch) in defaultdict (Liste) für einen invertierten Index anordnet
  • Kundenspezifische Sortierung mit Pandas
  • Eine python-benutzerdefinierte Klasse sortierbar machen, hashable
  • Strcmp für Python oder wie man Substrings effizient (ohne Kopie) beim Aufbau eines Suffix-Arrays sortiert
  • Meine Sequenz übersetzen?
  • Python-Sortierliste von Tupel
  • Wie bekomme ich 2.x-ähnliches Sortierverhalten in Python 3.x?
  • Python: Sortierfunktion bricht in Gegenwart von Nan
  • 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.