du durch so etwas wie dies tun numpy mit tun könnte, ist die mergsort stabil, so es wird Ihnen die erste oder letzte Vorkommen herausgreifen lassen von jeder Wert:
def unique(array, orderby='first'):
array = np.asarray(array)
order = array.argsort(kind='mergesort')
array = array[order]
diff = array[1:] != array[:-1]
if orderby == 'first':
diff = np.concatenate([[True], diff])
elif orderby == 'last':
diff = np.concatenate([diff, [True]])
else:
raise ValueError
uniq = array[diff]
index = order[diff]
return uniq[index.argsort()]
Diese Antwort ist sehr ähnlich:
def unique(array):
uniq, index = np.unique(array, return_index=True)
return uniq[index.argsort()]
Aber, numpy.unique verwendet intern eine unstable Sortierung, so dass nicht garantiert wird, dass ein bestimmter Index (erster oder letzter) erhalten wird.
Ich denke, eine geordnete dict könnte auch funktionieren:
def unique(array):
uniq = OrderedDict()
for i in array:
uniq[i] = 1
return uniq.keys()
immer hilfreich, um die Dokumente zu verlinken: [numpy.unique] (https://docs.scipy.org/doc/numpy-1.13.0/ reference/generated/numpy.unique.html) – BoltzmannBrain
Ja das bekommt die eindeutigen Indizes, aber ist das Sortieren notwendig? Die Iterationen erforderl zu sortieren sind die gleichen wie nur für einzigartige Gegenstände durch die Anordnung der Suche, so dass die Zeitkomplexität nicht vermieden werden kann. Aber numpy.unique gibt ein neues Array-Objekt zurück. Wir sollten diese räumliche Komplexität vermeiden können. – BoltzmannBrain