1

Ich habe 2d binäre numpyarrays unterschiedlicher Größe, die bestimmte Muster enthalten. Genau wie folgt aus:Berechnen Sie die Anzahl der gleichen benachbarten Zellen in einem Array numpy

import numpy 
a = numpy.zeros((6,6), dtype=numpy.int) 
a[1,2] = a[1,3] = 1 
a[4,4] = a[5,4] = a[4,3] = 1 

Hier wird das „Bild“ enthält zwei Patches eins mit 2 und eines mit 3 Zellen verbunden.

print a 
array([[0, 0, 0, 0, 0, 0], 
     [0, 0, 1, 1, 0, 0], 
     [0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 1, 1, 0], 
     [0, 0, 0, 0, 1, 0]]) 


Ich möchte wissen, wie oft eine Nicht-Null-Zelle eine andere Nicht-Null-Zelle grenzt (Nachbarn als Saatkrähe Fall definiert, so die Zellen nach links, rechts, unten und oben jeder Zelle) einschließlich ihrer Pseudo-Replikation (also umgekehrt).

Ein vorheriger approach für innere Grenzen gibt falsche Werte (5) zurück, da die äußeren Grenzen berechnet werden sollten.

numpy.abs(numpy.diff(a, axis=1)).sum() 

So für die obige Testanordnung, die korrekte Gesamtergebnis wäre (das obere Patch hat zwei interne Grenzen, die unteren vier) sein.

Dankbar für irgendwelche Tipps!

EDIT:

  • Fehler: Die untere hat offensichtlich 4 Innenkanten (benachbarte Zellen mit demselben Wert)

  • die gewünschten Nachbarschaft

+0

Was bedeutet "Nachbarn als Saatkrähe Fall definiert" bedeuten? – user2357112

+2

Warum ist das untere sechs? – HYRY

+0

Nun, die naheliegende Lösung wäre, einfach über die Indizes zu springen und zu zählen. –

Antwort

3

I etwas mehr erklärt denke, das Ergebnis ist 8, wenn es eine 8-zusammenhängende Nachbarschaft ist. Hier ist der Code:

import numpy 
a = numpy.zeros((6,6), dtype=numpy.int) 
a[1,2] = a[1,3] = 1 
a[4,4] = a[5,4] = a[4,3] = 1 

from scipy.ndimage import convolve 

kernel = np.ones((3, 3)) 
kernel[1, 1] = 0 
b = convolve(a, kernel, mode="constant") 
b[a != 0].sum() 

aber Sie sagte Rook Fall.

bearbeiten

Hier ist der Code für 4-verbunden Nachbarschaft:

import numpy as np 
a = np.zeros((6,6), dtype=np.int) 
a[1,2] = a[1,3] = 1 
a[4,4] = a[5,4] = a[4,3] = 1 

from scipy import ndimage 
kernel = ndimage.generate_binary_structure(2, 1) 
kernel[1, 1] = 0 

b = convolve(a, kernel, mode="constant") 
b[a != 0].sum() 
+0

Sorry für Missverständnisse. Ich möchte eine einfache 4x4 Nachbarschaft kennen (also keine diagonalen Verbindungen, zB links, rechts, oben, unten). Ich habe meine Frage oben bearbeitet, da die richtige Antwort in der Tat ** 6 ** und nicht * 8 * ist (die Gesamtzahl der gleichen Nachbarn in der unteren Hälfte ist 4) – Curlew

+0

Ich habe versucht, Ihr Beispiel anzupassen, aber es scheint nicht zu sei so einfach ... '' 's = ndimage.generate_binary_structure (2,2) s [0,0] = s [0,2] = s [2,0] = s [2,2] = 0 b = ndimage.convolve (a, s, mode = "konstant") b [a! = 0] .sum() # entspricht 11 '' ' – Curlew

+0

Whop, das macht den Trick. Vergessen, die Center-Zelle zu ersetzen ... Danke! – Curlew

Verwandte Themen