Numpy Array Frage?


02.11.2021, 14:24

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.


DualStudieren 
Fragesteller
 02.11.2021, 15:00

ich weiß dass man das so machen kann, aber genau so will ich es ja nicht tun

0
GuteAntwort2021  02.11.2021, 15:04
@DualStudieren

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.

0
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.


DualStudieren 
Fragesteller
 02.11.2021, 14:43

,,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.

0
Destranix  02.11.2021, 19:11
@DualStudieren

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.

0