2013-11-21 15 views
8

Ho una matrice numpy 2D in cui alcuni valori sono zero e altri no. Sto cercando di trovare un modo efficace per trovare il maggior numero di zeri nell'array (restituendo il numero di zeri, nonché un'idea approssimativa di dove è il centro)Python - Modo efficiente per trovare l'area più grande di un valore specifico in un array numpy 2D

Ad esempio in questo array, I vorrebbe trovare il ciuffo di 9, con il centro di (3,4):

[[ 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 ]] 

esiste un modo vettorializzare bella di realizzare qualcosa di simile in NumPy o SciPy?

I ciuffi saranno di forma approssimativamente circolare e non hanno buchi.

ndimage.label() da scipy fa qualcosa di simile a questo, ma non è proprio quello che sto cercando. Ho una sensazione numpy.where() e numpy.diff() potrebbe essere utile, ma non sono sicuro di come usarli in modo efficiente per risolvere questo problema.

+1

E se c'è un buco? Stai dicendo che non ci saranno buchi perché sai qualcosa su come appare l'input, o perché vuoi escludere grumi con buchi? – user2357112

+0

È perché so che l'ingresso non avrà alcun fori (e in tal caso, saranno estremamente raro) – Brent

risposta

9

Sei quasi arrivati, basta combinare ndimage.label con 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 

Una volta che avete clump_mask è possibile calcolare il baricentro o utilizzare un altro metodo per ottenere il centro.

+4

E '* * folle quanto vicino è quello di quello che stavo per incollare! Le uniche cose che ho fatto diversamente erano (1) '.ravel(). Astype (int)', perché ricevevo lamentele sulla conversione da 'uint32' a' int32', e (2) ho aggiunto (cambiando i nomi delle variabili in modo che corrispondessero il tuo) 'com = scipy.ndimage.center_of_mass (array == 0, label, biggest_label)' per ottenere il centro. – DSM

+0

@DSM Le grandi menti pensano allo stesso modo :) –

+0

Grazie! Funziona perfettamente :) – Brent

Problemi correlati