So finden Nachbarn eine 2D-Liste in python?
Ich habe eine 2D-Liste, die nur 1 und 0:
Boundaries = [
[0,0,0,0,0],
[0,1,1,1,0],
[0,1,1,1,1],
[0,1,1,1,0],
[0,0,1,0,0]]
Brauche ich um zu testen, diese Liste zu prüfen, ob es 1 ist umgeben von 8 weiteren 1 ist (wie die Mitte 1 in dieser Liste). Wenn es eine 1 ist umgeben von 1 s als Nachbarn sollte es dann geändert werden in eine 0, so dass nach dem ausführen des Programms in der Liste oben zurückkehren würde, wie so etwas wie dieses:
[
[0,0,0,0,0],
[0,1,1,1,0],
[0,1,0,1,1],
[0,1,1,1,0],
[0,0,1,0,0]]
Ich versuche, nur einen parameter (die matrix von 1 und 0 ist). Für einige Grund, das ist eine unglaublich schwierige Sache zu wickeln meinem Kopf herum. So weit mein code sieht ungefähr so aus:
def tempBoundaries(matrixC):
for i in matrixC:
for j in i:
if j == 1:
try:
if matrixC[i-1]==1 or matrixC[i+1]==1:
.......
Dies ist ein echter Kampf, aus welchem Grund auch immer und ich scheine unfähig, herauszufinden, was zu tun, irgendwelche Tipps oder Hilfe wäre sehr geschätzt werden! Danke.
- Schön. Sind Sie offen für mithilfe von numpy?
- Wenn Sie brauchen, um zu öffnen, dass viele code-Blöcke, es ist ein guter Hinweis, dass Sie brauchen, um eine Methode zu erstellen - ansonsten ist der code schwierig zu verstehen, sehr schnell
- sollten Sie verwenden
convolve2d
- Du wirst etwas finden, ähnlich wie hier stackoverflow.com/questions/12612663/...
- Was ist, wenn Sie einen block mit 4x4-1s? Sollte nur eine der zentralen 1s geändert werden auf 0 oder alle vier?
- Ich bin versucht, nur mit Vanille-python, numpy ist ein Nein, Nein leider nicht :/
- alle 1 sollte 0 sein, ja.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwendung von scipy würden Sie etwas wie die folgende
Also der ganze Vorgang ist einfach:
Seit dem keine numpy Anforderung wurde Hinzugefügt, später habe ich das Gefühl, ich sollte hinzufügen, eine Reine python-Antwort.
Könnten Sie flip-Algorithmus um. Diese Antwort ist inspiriert durch die Hough-Transformation verwendet, in der computer vision Merkmalsextraktion (http://en.wikipedia.org/wiki/Hough_transform). Statt auf die Jagd um eine position lassen Sie die Positionen Stimmen Sie für die Dinge, die Sie beeinflussen. In Ihrem Fall jede position mit einer 1 in es-Stimmen für sich selbst und alle seine Nachbarn.
Ist es ein bisschen einen anderen Ansatz, aber es vereinfacht die Logik um zu schlagen, werden die Kanten der Daten. Sie können einfach ignorieren, dass Aspekt denn auch wenn, zum Beispiel, (-1, 0) wird gewählt, es wird nicht genug Stimmen bekommen, um berücksichtigt werden.
Aktualisiert
Geändert, so dass eine Zelle keine Stimme für sich selbst. Dies erlaubt uns, es im anderen Fall auch (durch die Suche nach Zellen, die 8 Stimmen). Ich habe split in einer Funktion findet alle Zellen, die umgeben sind von 1s und eine operation, die beim kippen (je nach dem was du suchst).
to_change
enthält die Indizes, die Sie interessiert sind in. Im letzten Schritt verwende ich die Indizes ändern Sie die Werte inBoundaries
.neighbours_of
Methode ist sehr elegant.Um Ihren code zu vereinfachen, sollten Sie, um den code zu prüfen, der Nachbarn innerhalb einer Funktion. Sie können auch eine Liste von Richtungen, dann Durchlaufen Sie die Anweisungen, wie diese:
In der main-Funktion, die matrix ist im Grunde eine Liste von Listen. Da wirst du zu manipulieren, die Indizes verwenden, sollten Sie
range
der möglichen Indizes.was dazu:
Können Sie
numpy
dann sollten Sie die Bilder entsprechend:
Haftungsausschluss : dieser code ist nicht zu töten 1s in Grenzen. Sie müssen es entsprechend
Kein numpy
Bearbeiten
Ich denke, das ist eine bessere Lösung, als es bricht die innere Schleife, sobald ein Nachbar ist
gleich null
ausführen des oben aufgeführte Codes gibt
Meinen bisherigen code nach der
Ende Bearbeiten
Habe ich eine einfache wie dieses, Sie können Sie benutzerdefinierte
1. Beispiel:
Ausgabe:
[8, 10, 5, 4, 6, 13, 12, 14]
2. Beispiel:
Ausgabe:
[14, 11, 10]
Lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben