Y at-il une fonction « boîte englobante » (tranche avec des valeurs non nulles) pour un ndarray à NumPy?
Question
Je traite avec des tableaux créés par numpy.array (), et je dois dessiner des points sur une toile simulant une image. Comme il y a beaucoup de valeurs nulles autour de la partie centrale du tableau qui contient les données significatives, je voudrais « couper » le tableau, l'effacement des colonnes qui ne contiennent que des zéros et des lignes qui ne contiennent que des zéros.
Alors, je voudrais savoir d'une fonction de numpy native ou même un extrait de code à « couper » ou trouver une « boîte englobante » à tranche uniquement les données contenant une partie du tableau.
(car il est une question conceptuelle, je ne l'ai pas tout le code, désolé si je dois, je suis très frais à l'affichage à SO.)
Merci pour la lecture
La solution
Le code ci-dessous, à partir de les pistes les plus rapides dans mes tests de cette réponse:
def bbox2(img):
rows = np.any(img, axis=1)
cols = np.any(img, axis=0)
ymin, ymax = np.where(rows)[0][[0, -1]]
xmin, xmax = np.where(cols)[0][[0, -1]]
return img[ymin:ymax+1, xmin:xmax+1]
La réponse acceptée à l'aide argwhere
fonctionnait, mais a couru plus lent. Je suppose, c'est parce que argwhere
alloue un tableau de sortie géant des indices. Je testé sur un grand tableau 2D (une image de 1024 x 1024, avec approximativement une région non nulle 50x100).
Autres conseils
Cela devrait le faire:
from numpy import array, argwhere
A = array([[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0],
[0, 0, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0]])
B = argwhere(A)
(ystart, xstart), (ystop, xstop) = B.min(0), B.max(0) + 1
Atrim = A[ystart:ystop, xstart:xstop]
Quelque chose comme:
empty_cols = sp.all(array == 0, axis=0)
empty_rows = sp.all(array == 0, axis=1)
Les tableaux résultants seront 1D tableaux booléens. Boucle sur les deux extrémités de trouver la « boîte englobante ».