Dies wird in einem Durchgang durchgeführt, ohne für die resultierenden Arrays jeden zusätzlichen Speicher zu erfordern.
Paar bis die Elemente an jedem Index und iterieren sie. Verfolgen Sie, welche Paare bisher gesehen wurden und einen Zähler des Index der Arrays. Wenn ein neues Paar noch nie zuvor gesehen wurde, wird der Index um 1 erhöht und effektiv an den ursprünglichen Platz zurückgeschrieben. Bei einem doppelten Paar erhöht sich jedoch nicht der Index, wodurch effektiv jedes neue Paar um eine Position nach links verschoben wird. Am Ende halten Sie die erste index
th Anzahl der Elemente, um die Arrays zu verkürzen.
import itertools as it
def delete_duplicate_pairs(*arrays):
unique = set()
arrays = list(arrays)
n = range(len(arrays))
index = 0
for pair in it.izip(*arrays):
if pair not in unique:
unique.add(pair)
for i in n:
arrays[i][index] = pair[i]
index += 1
return [a[:index] for a in arrays]
Wenn Sie auf Python sind 2, erstellt zip()
die Liste von Paaren vorne. Wenn Sie viele Elemente in Ihren Arrays haben, ist es effizienter, itertools.izip()
zu verwenden, wodurch die Paare so erstellt werden, wie Sie sie anfordern. zip()
in Python 3 verhält sich jedoch standardmäßig so.
Für Ihren Fall
>>> import numpy as np
>>> a = np.array([1,3,6,3,7,8,3,2,9,10,14,6])
>>> b = np.array([2,4,15,4,7,9,2,2,0,11,4,15])
>>> a, b = delete_duplicate_pairs(a, b)
>>> a
array([ 1, 3, 6, 7, 8, 3, 2, 9, 10, 14])
>>> b
array([ 2, 4, 15, 7, 9, 2, 2, 0, 11, 4])
Nun es kommt alles darauf an, welche Werte Ihre Arrays halten. Wenn Sie nur die Werte 0-9 haben, gibt es nur 100 eindeutige Paare und die meisten Elemente werden Duplikate sein, was Ihnen Zeit spart. Bei 20 Millionen Elementen für a
und b
, die nur Werte zwischen 0 und 9 enthalten, ist der Prozess in 6 Sekunden abgeschlossen. Bei Werten zwischen 0 und 999 dauert es 12 Sekunden.
'b [a = b! ] 'und' a [a! = b] 'würde funktionieren? – Zero
Ich habe versucht, es funktioniert nicht wie erwartet. –
Ah, die Frage falsch gelesen, 'np.vstack ({Tupel (Zeile) für Zeile in np.column_stack ((a, b))})' sollte funktionieren, kann nicht geben Sie Ihre erste eindeutige Element Reihenfolge. – Zero