Ich bin neu in Python, so kann ich etwas falsch machen. Lass mich zuerst erklären, was ich will.Argsort auf numpy.array als Generator
Ich habe eine große 1D numpy.array
mit einigen Werten und ich muss die Indizes der ersten n kleinsten Werte kennen. Ich brauche sie für spätere Berechnungen. Natürlich kann ich einfach etwas tun wie ind = numpy.argsort(hugearray)[:n]
.
Das Problem ist, dass ich vorher nicht weiß, wie viele Indizes ich brauche, meine Berechnungen sind iterativ und holen eins nach dem anderen Index, bis es genug für die Berechnung gibt.
Eine andere Sache ist, dass ich einen faulen Argsort haben möchte, um zu vermeiden, neue ganze Reihe von argsorted Werten zu schaffen und unnötige Suche zu verhindern, also dachte ich an einen Generator. Aber ich weiß wirklich nicht, wie man es mit einem numpy.array macht.
UPD: aus hpaulj Antwort, habe ich versucht, einen Generator zu erstellen:
def gargsort(arr):
arr=arr.copy()
for i in range(len(arr)):
k = np.argmin(arr)
arra[k] = np.iinfo(arr[k]).max
yield k
Kann sein, es ist möglich, es besser zu machen?
Mathematisch müssen Sie das gesamte Array sortieren, um die kleinsten Elemente zu kennen? –
'np.argpartition (hugearray, n) [: n]' gibt die gleichen Indizes zurück, aber in einer unsortierten Reihenfolge. Es ist eine teilweise Bestellung. Aber es gibt keine Garantie, dass es schneller ist als der volle Argsort. – hpaulj
@ B.M. Ja, sicher, ich muss das riesige Array n Mal durchlaufen, mit ungefähr. n * (len_array + 1 - n) greift auf array zu, wenn ich jedes Mal nach argmin suche und es dann aus dem Array ablege. – Daria