Mein Problem ist die folgende,Wie Clustergrößen in 2D-numpy-Array zu finden?
Ich habe ein mit 0 ein 1, mit einer absorbierenden Randbedingung (all äußeren Elemente sind 0), beispielsweise gefüllt numpy Array 2D:
[[0 0 0 0 0 0 0 0 0 0]
[0 0 1 0 0 0 0 0 0 0]
[0 0 1 0 1 0 0 0 1 0]
[0 0 0 0 0 0 1 0 1 0]
[0 0 0 0 0 0 1 0 0 0]
[0 0 0 0 1 0 1 0 0 0]
[0 0 0 0 0 1 1 0 0 0]
[0 0 0 1 0 1 0 0 0 0]
[0 0 0 0 1 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]]
Ich mag um eine Funktion zu erstellen, die dieses Array und seine lineare Dimension L als Eingabeparameter verwendet (in diesem Fall L = 10) und die Liste der Clustergrößen dieses Arrays zurückgibt.
von „Clustern“ meine ich die isolierten Gruppen von Elementen 1 des Arrays
dem Array-Element [i] [j] isoliert wird, wenn alle seine Nachbarn Nullen sind, und ihre Nachbarn sind die Elemente:
[i+1][j]
[i-1][j]
[i][j+1]
[i][j-1]
So in der vorherigen Anordnung haben wir 7 Cluster von Größen (2,1,2,6,1,1,1)
ich habe versucht, diese Aufgabe abzuschließen durch zwei Funktionen erstellen, die erste ist eine rekursive Funktion:
def clust_size(array,i,j):
count = 0
if array[i][j] == 1:
array[i][j] = 0
if array[i-1][j] == 1:
count += 1
array[i-1][j] = 0
clust_size(array,i-1,j)
elif array[i][j-1] == 1:
count += 1
array[i-1][j] = 0
clust_size(array,i,j-1)
elif array[i+1][j] == 1:
count += 1
array[i-1][j] = 0
clust_size(array,i+1,j)
elif array[i][j+1] == 1:
count += 1
array[i-1][j] = 0
clust_size(array,i,j+1)
return count+1
und es sollte die Größe eines Clusters zurückgeben. Jedes Mal, wenn die Funktion ein Array-Element gleich 1 findet, erhöht sie den Wert des Zählers "count" und ändert den Wert des Elements in 0, auf diese Weise wird jedes "1" -Element nur einmal gezählt. Wenn einer der Nachbarn des Elements gleich 1 ist, ruft die Funktion sich selbst für dieses Element auf.
Die zweite Funktion ist:
def clust_list(array,L):
sizes_list = []
for i in range(1,L-1):
for i in range(1,L-1):
count = clust_size(array,i,j)
sizes_list.append(count)
return sizes_list
und es sollte die Liste mit den Clustergrößen zurück. Die for-Schleife iteriert von 1 bis L-1, da alle äußeren Elemente sind 0.
Dies funktioniert nicht, und ich kann nicht sehen, wo der Fehler ...
Ich frage mich, vielleicht, wenn es ein einfacher Weg, es zu tun.