Numpy Array Frage?
Bei ca. 600 Datensätzen wird sich das schon lohnen.
Alles sind floats
so nun will ich, effizient, etwas schieben
Konkret: Ich will am Array ein Element hinten anhängen und das erste Element löschen, also so löschen, dass der erste Platz gar nicht mehr da ist. Und das nullte Element somit mein ursprünglich zweites Element ist.
Evtl. könnte ich, wenn ich das neue Element hinten angehängt habe, alle Elemente eins nach links schieben, damit der erste Platz wieder belegt ist.
Geht das irgendwie möglichst effizient?
von mir aus ist dieses Array mit 600 Plätzen, auch eine Matrix mit einer Zeile und 600 Spalten.
3 Antworten
Dafür würde ich dir am ehesten eine Deque empfehlen.
from collections import deque
liste = deque()
Da kannst du dann mit liste.append(element) am Ende und mit liste.appendleft(element) am Anfang neue Elemente anfügen und mit pop() vom Ende und popleft() vom Anfang die Elemente wieder entfernen.
Oder du kannst mit liste.rotate(anzahl) automatisch von hinten Elemente wegnehmen und sie vorne wieder anhängen. (Bzw. wenn Anzahl negativ ist, dann von vorne wegnehmen und hinten anhängen)
In der Regel benutzt man dafür heutzutage eher Listen, aber wenn du es unbedingt mit einem Array lösen willst, fängst du die Schleife bei 1 an und setzt dann jeweils array[i-1] = array[i].
Dazu geh einfach mal zu einem Online Java Compiler
https://www.jdoodle.com/online-java-compiler/
und guck dir den folgenden Code an:
public class MyClass {
public static void main(String args[]) {
int[] temp = {1,2,3,4,5,6};
//Ausgabe des Arrays VOR der Änderung
System.out.println("Ursprüngliches Array:\n");
for (int i=0; i<temp.length; i++) {
System.out.println("Array["+i+"] = " + temp[i]);
}
System.out.println("\nSchiebe alle Elemente um eine Stelle nach links und setze eine 7 ans Ende!\n");
//Setze 7 ans Ende des Arrays
for (int i=1; i<temp.length; i++) {
temp[i-1] = temp[i];
//Sind wir am Ende des Arrays angekommen, dann:
if (i+1 == temp.length) {
temp[i] = 7;
}
}
//Ausgabe des Arrays NACH der Änderung
System.out.println("Array nach der Änderung:\n");
for (int i=0; i<temp.length; i++) {
System.out.println("Array["+i+"] = " + temp[i]);
}
}
}
Der sollte hoffentlich ausführlich erklärt und offensichtlich darstellen, wie man es zum Beispiel machen könnte.
Selbst wenn du eine Bibliothek mit entsprechender Methode finden solltest, werden die das dort genauso handhaben.
Und auch wenn du Zugriff auf die Pointer der entsprechenden Arraystellen hättest, müsstest du immer noch jeden Pointer entsprechend überschreiben, was das ganze einfach nur in grün ist und wesentlich komplizierter.
Deswegen arbeitet man heutzutage auch mit Listen für solche interaktiven Fälle und nicht mit Arrays.
Ich will am Array ein Element hinten anhängen und das erste Element löschen, also so löschen, dass der erste Platz gar nicht mehr da ist. Und das nullte Element somit mein ursprünglich zweites Element ist.
Das könnte im Prinzip in O(1) machbar sein, indem man den darunterliegenden Pointer umbiegt.
Alle Elemente zu verschieben geht nur in O(n) (oder amortisiert evtl. weniger, je nachdem, wie das intern umgesetzt wird. Bei einer Liste von Arrays ginge das beispielsweise schneller).
Ich hätte folgende API-Methode gefunden:
https://numpy.org/doc/stable/reference/generated/numpy.delete.html
Ich würde da einfach mal davon ausgehen, dass die das nach der ersten Variante lösen oder dass die wiederrum API-Methoden aufrufen, die das letztendlich so machen.
,,Alle Elemente zu verschieben geht nur in O(n) (oder amortisiert evtl. weniger, je nachdem, wie das intern umgesetzt wird. " das mache ich sowieso nicht, da kommt man in Teufelsküche.
Nun, wenn du die Größe eines Array veränderst könnte es aber sein, das eben das passiert. Außerdem hast du eben das vorgeschlagen in deiner Antwort: Alle Elemente um eins nach links zu verschieben entspricht eben dem beschriebenem.
ich weiß dass man das so machen kann, aber genau so will ich es ja nicht tun