Ich möchte mehrere Werte in einem 1D-Array / einer Liste mit neuen suchen und ersetzen.
Im Beispiel für eine Liste
%Vor%Ich möchte
ersetzen %Vor%mit
%Vor%Daher ist das neue Array:
%Vor%Was ist der schnellste Weg, dies zu tun (für sehr große Listen, d. h. mit 50000 Werten zu finden und zu ersetzen)?
Kommentar von dem anwsers
Vielen Dank an alle für eine schnelle Antwort! Ich überprüfte die vorgeschlagenen Lösungen mit folgendem:
%Vor%Die Ergebnisse:
%Vor% Der relative Unterschied in der Leistung steigt mit biger N
, d. h. wenn N=10**7
, dann nimmt das Ergebnis von Ashwini_Chaudhary 207 ms
und das Ergebnis von swenzel 6.89 s
.
Angenommen, Ihr val_old
-Array ist sortiert (was hier der Fall ist, aber wenn das später nicht der Fall ist, dann vergessen Sie nicht, val_new
mit zu sortieren!), können Sie numpy.searchsorted
und dann verwenden Zugriff auf val_new
mit den Ergebnissen.
Dies funktioniert nicht, wenn eine Nummer keine Zuordnung hat, müssen Sie in diesem Fall 1to1 Mappings bereitstellen.
50k Zahlen? Kein Problem!
%Vor%500k? Sie werden den Unterschied nicht bemerken!
%Vor%Das numpy_indexed Paket (Disclaimer: Ich bin der Autor) bietet eine elegante und effiziente vektorisierte Lösung für diese Art von Problem:
%Vor%Die implementierte Methode basiert auf einer Suche ähnlich der von swenzel und sollte eine ähnlich gute Leistung haben, aber allgemeiner. Zum Beispiel müssen die Elemente des Arrays nicht ints sein, sondern können von jedem Typ sein, sogar nd-Sub-Arrays selbst.
Wenn erwartet wird, dass alle Werte in 'a' in 'val_old' vorhanden sind, können Sie das optionale 'fehlende' kwarg auf 'raise' setzen (Standard ist 'ignore'). Die Leistung wird etwas besser sein, und Sie erhalten einen KeyError, wenn diese Annahme nicht erfüllt ist.
In Pandas würde ich ein Diktat aus den 2 Listen erstellen und dann map
aufrufen, das eine Suche durchführt und die Werte ersetzt:
Für eine 80000-Element-Serie sind 3,4 ms erforderlich:
%Vor%Dies ist ein vektorisierter Ansatz und skaliert viel besser als jede iterationsbasierte Methode