2013-11-21 14 views
8

Mam tablicę 2D numpy, w której niektóre wartości wynoszą zero, a niektóre nie. Próbuję znaleźć skuteczny sposób na znalezienie największej grupy zer w tablicy (zwracając liczbę zer, a także przybliżony obraz miejsca w środku). chciałby odnaleźć kępę 9, z centrum (3,4):Python - Skuteczny sposób na znalezienie największego obszaru określonej wartości w tablicy numpy 2D

[[ 1, 1, 1, 0, 0 ], 
[ 1, 0, 1, 1, 0 ], 
[ 1, 1, 1, 1, 1 ], 
[ 1, 1, 0, 0, 0 ], 
[ 1, 1, 0, 0, 0 ], 
[ 1, 1, 0, 0, 0 ]] 

Czy istnieje ładny wektorowy drogą do osiągnięcia czegoś takiego w numpy lub scipy?

Kępy będą miały kształt zbliżony do okrągłego i nie mają w nich dziur.

ndimage.label() z scipy robi coś podobnego, ale nie do końca jestem tym, za czym jestem. Mam wrażenie, że numpy.where() i numpy.diff() mogą być pomocne, ale nie wiem, jak skutecznie je wykorzystać, aby rozwiązać ten problem.

+1

Co zrobić, jeśli istnieje dziura? Czy mówisz, że nie będzie dziur, ponieważ wiesz coś o tym, jak wygląda wejście, lub chcesz wykluczyć kępy z dziurami? – user2357112

+0

To dlatego, że wiem, że dane wejściowe nie będą miały żadnych dziur (a jeśli tak, będą bardzo rzadkie) – Brent

Odpowiedz

9

Jesteś prawie tam, wystarczy połączyć ndimage.label z numpy.bincount:

import numpy as np 
from scipy import ndimage 

array = np.random.randint(0, 3, size=(200, 200)) 

label, num_label = ndimage.label(array == 0) 
size = np.bincount(label.ravel()) 
biggest_label = size[1:].argmax() + 1 
clump_mask = label == biggest_label 

Gdy masz clump_mask można obliczyć ciężkości lub użyć innej metody, aby dostać się do centrum.

+4

To jest * szaleństwo * jak blisko tego jest to, co miałem wkleić! Jedyne, co zrobiłem inaczej, to (1) '.ravel(). Astype (int)', ponieważ otrzymywałem skargi na konwersję z 'uint32' na' int32' oraz (2) dodałem (zmieniając nazwy zmiennych, aby dopasować yours) 'com = scipy.ndimage.center_of_mass (array == 0, label, biggest_label)', aby uzyskać centrum. – DSM

+0

@DSM Wielkie umysły myślą podobnie :) –

+0

Dzięki! Działa świetnie :) – Brent

Powiązane problemy