Erstellen eines spiralförmigen Arrays in Python?

8

Ich und mein Kumpel haben versucht, ein lustiges Spiel in Python zu erstellen, bei dem auf die Elemente, die in das Array eingegeben wurden, spiralförmig zugegriffen wird. Ich habe einige Methoden ausprobiert wie eine unten angegebene ( Quelle ).

%Vor%

Die obige Anweisung greift auf die Elemente in der Spiralschleife zu und druckt sie für ein definiertes Array AE. Ich würde gerne wissen, wie ich ein gegebenes Array AE in eine Spirale transformieren kann

    
Smple_V 25.04.2016, 07:36
quelle

6 Antworten

10

Sie können eine Spirale erstellen, indem Sie in der Nähe der Mitte der Matrix beginnen und immer nach rechts drehen, es sei denn, das Element wurde bereits besucht:

%Vor%

Beispiel:

%Vor%     
jfs 27.04.2016, 12:26
quelle
4

Einleitende Bemerkungen

Die Frage hängt eng mit dem Problem zusammen, ein Array in einer spiralförmigen Reihenfolge zu drucken. In der Tat, wenn wir bereits eine Funktion haben, die das tut, dann ist das fragliche Problem relativ einfach.

Es gibt eine Vielzahl von Ressourcen zu zum Erstellen einer Spiralmatrix oder zu loop oder drucke ein Array in spiralförmiger Reihenfolge. Trotzdem entschied ich mich, meine eigene Version zu schreiben, indem ich numpy Arrays benutzte. Die Idee ist nicht originell, aber die Verwendung von numpy macht den Code prägnanter.

Der andere Grund ist, dass die meisten Beispiele zum Erzeugen einer von mir gefundenen Spiralmatrix (einschließlich des Codes in der Frage und in den anderen Antworten) nur quadratische Matrizen der Größe n x n für ungerade n betreffen. Das Finden des Anfangs- (oder End-) Punktes in Matrizen anderer Größen kann schwierig sein. Zum Beispiel kann es für eine 3 × 5-Matrix nicht die mittlere Zelle sein. Der folgende Code ist allgemein und die Position des Anfangs- (End-) Punktes hängt von der Wahl der Funktion spiral_xxx ab.

Code

Die erste Funktion packt ein Array im Uhrzeigersinn spiralförmig aus:

%Vor%

Wir können diese Funktion auf acht verschiedene Arten schreiben, je nachdem wo wir anfangen und wie wir die Matrix drehen. Ich werde eine andere geben, die konsistent ist (das wird später deutlich werden) mit der Matrixtransformation im Bild in der Frage. Also, weiter, werde ich diese Version verwenden:

%Vor%

Wie es funktioniert:

%Vor%

Beachten Sie, dass der Endpunkt (oder Startpunkt) nicht die mittlere Zelle ist. Diese Funktion funktioniert für alle Arten von Matrizen, aber wir benötigen eine Hilfsfunktion, die spiral indices erzeugt:

%Vor%

Zum Beispiel:

%Vor%

Jetzt kommen die zwei Hauptfunktionen . Man transformiert eine Matrix in eine Spiralform derselben Dimension, die andere kehrt die Transformation um:

%Vor%

Beispiele

Matrix 3 x 5:

%Vor%

Matrix aus der Frage:

%Vor%

Bemerkung

Wenn Sie nur mit festen Matrizen arbeiten, zum Beispiel 5x5, dann sollten Sie base_spiral(*A.shape) in Definitionen der Funktionen durch eine feste Matrix von Indizes ersetzen, sagen wir Ind (wo Ind = base_spiral(5,5) ).

    
ptrj 30.04.2016 23:26
quelle
1

Im Folgenden ist python3-Code, der Folgendes transformiert:

%Vor%

bis

%Vor%

Sie können die Implementierung einfach so ändern, wie Sie wollen ...

%Vor%     
Jarek Szymla 25.04.2016 08:01
quelle
1

Hier ist eine Lösung mit itertools und praktisch keine Mathematik, nur Beobachtungen darüber, wie die Spirale aussieht. Ich denke, es ist elegant und ziemlich leicht zu verstehen.

%Vor%

Verwendung:

%Vor%

Ausgabe:

%Vor%

Hier ist die gleiche Lösung gekürzt:

%Vor%

Ich habe die Tatsache ignoriert, dass die Eingabe ein 2D-Array sein soll, da es viel sinnvoller ist, wenn es 1D-iterierbar ist. Sie können das Eingabe-2D-Array auf einfache Weise reduzieren, wenn Sie möchten. Ich habe auch angenommen, dass die Ausgabe ein Quadrat sein sollte, da ich nicht denken kann, was Sie sonst vernünftig wünschen würden. Es kann über die Kante gehen und einen Fehler auslösen, wenn das Quadrat eine gerade Länge hat und der Eingang zu lang ist. Auch hier weiß ich nicht, was die Alternative wäre.

    
Alex Hall 01.05.2016 00:17
quelle
0

Sie können ein Array mit etwas wie folgt füllen:

%Vor%

Die Ausgabe davon wird sein:

%Vor%     
vmonteco 25.04.2016 08:26
quelle
0
%Vor%     
user640554 20.11.2017 02:51
quelle

Tags und Links