¿Cómo ubicar una “región” particular de valores en una matriz numpy 2D?

Estoy trabajando con una matriz de numpy 2D hecha de 101x101=10201 valores. Dichos valores son de tipo float y van desde 0.0 a 1.0 . La matriz tiene un sistema de coordenadas X,Y que se origina en la esquina superior izquierda: así, la posición (0,0) encuentra en la esquina superior izquierda, mientras que la posición (101,101) está en la esquina inferior derecha.

Así es como se ve la matriz 2D (solo un extracto):

 X,Y,Value 0,0,0.482 0,1,0.49 0,2,0.496 0,3,0.495 0,4,0.49 0,5,0.489 0,6,0.5 0,7,0.504 0,8,0.494 0,9,0.485 

Me gustaría poder:

1) Cuente el número de regiones de celdas (vea la imagen a continuación) cuyo valor excede un umbral dado, digamos 0.3 ;

2) Determine la distancia entre los centros visuales de dichas regiones y la esquina superior izquierda, que tiene coordenadas (0,0) .

¿Cómo podría hacerse esto en Python 2.7?

Esta es una representación visual de una matriz 2D con 2 regiones resaltadas (cuanto más oscuro es el color, mayor es el valor ):

introduzca la descripción de la imagen aquí

Puede encontrar qué píxeles satisfacen su corte utilizando una condición booleana simple, luego use scipy.ndimage.label y scipy.ndimage.center_of_mass para encontrar las regiones conectadas y calcular sus centros de masa:

 import numpy as np from scipy import ndimage from matplotlib import pyplot as plt # generate some lowpass-filtered noise as a test image gen = np.random.RandomState(0) img = gen.poisson(2, size=(512, 512)) img = ndimage.gaussian_filter(img.astype(np.double), (30, 30)) img -= img.min() img /= img.max() # use a boolean condition to find where pixel values are > 0.75 blobs = img > 0.75 # label connected regions that satisfy this condition labels, nlabels = ndimage.label(blobs) # find their centres of mass. in this case I'm weighting by the pixel values in # `img`, but you could also pass the boolean values in `blobs` to compute the # unweighted centroids. r, c = np.vstack(ndimage.center_of_mass(img, labels, np.arange(nlabels) + 1)).T # find their distances from the top-left corner d = np.sqrt(r*r + c*c) # plot fig, ax = plt.subplots(1, 2, sharex=True, sharey=True, figsize=(10, 5)) ax[0].imshow(img) ax[1].hold(True) ax[1].imshow(np.ma.masked_array(labels, ~blobs), cmap=plt.cm.rainbow) for ri, ci, di in zip(r, c, d): ax[1].annotate('', xy=(0, 0), xytext=(ci, ri), arrowprops={'arrowstyle':'<-', 'shrinkA':0}) ax[1].annotate('d=%.1f' % di, xy=(ci, ri), xytext=(0, -5), textcoords='offset points', ha='center', va='top', fontsize='x-large') for aa in ax.flat: aa.set_axis_off() fig.tight_layout() plt.show() 

introduzca la descripción de la imagen aquí