Assez simple vraiment avec view_as_windows
from scikit-image
, pour obtenir ces vues fenêtrées coulissantes comme un tableau 6D avec le quatrième axe étant singleton. Ensuite, utilisez advanced-indexing
pour sélectionner ceux que nous voulons en fonction des index y
et x
pour indexation dans les deuxième et troisième axes du tableau fenêtré pour obtenir notre B
.
Par conséquent, la mise en œuvre serait -
from skimage.util.shape import view_as_windows
BSZ = 16, 16 # Blocksize
A6D = view_as_windows(A,(1,BSZ[0],BSZ[1]))
B_out = A6D[np.arange(N),y,x,0]
Explication
expliquer à d'autres lecteurs sur ce qui se passe vraiment sur le problème, voici un échantillon analysé sur un ensemble de données plus petit et avec un blocksize de (2,2)
-
1) tableau d'entrée (3D):
In [78]: A
Out[78]:
array([[[ 5, 5, 3, 5, 3, 8],
[ 5, *2, 6, 2, 2, 4],
[ 4, 3, 4, 9, 3, 8],
[ 6, 3, 3, 10, 4, 5],
[10, 2, 5, 7, 6, 7],
[ 5, 4, 2, 5, 2, 10]],
[[ 4, 9, 8, 4, 9, 8],
[ 7, 10, 8, 2, 10, 9],
[10, *9, 3, 2, 4, 7],
[ 5, 10, 8, 3, 5, 4],
[ 6, 8, 2, 4, 10, 4],
[ 2, 8, 6, 2, 7, 5]],
[[ *4, 8, 7, 2, 9, 9],
[ 2, 10, 2, 3, 8, 8],
[10, 7, 5, 8, 2, 10],
[ 7, 4, 10, 9, 6, 9],
[ 3, 4, 9, 9, 10, 3],
[ 6, 4, 10, 2, 6, 3]]])
2) indices y et x pour indexer dans les deuxième et troisième axes:
In [79]: y
Out[79]: array([1, 2, 0])
In [80]: x
Out[80]: array([1, 1, 0])
3) Enfin, la sortie désirée, ce qui est un bloc chacun de chacune des tranches 2D le long du premier axe et dont Le point de départ (point en haut à gauche) est (y,x)
sur cette tranche 2D. Veuillez vous référer aux astérisques A pour ceux -
In [81]: B
Out[81]:
array([[[ 2, 6],
[ 3, 4]],
[[ 9, 3],
[10, 8]],
[[ 4, 8],
[ 2, 10]]])
L'une ou l'autre des solutions proposées a-t-elle fonctionné pour vous? – Divakar
Oui, ils sont tous les deux bons, mais le vôtre suppose des tranches différentes pour chaque échantillon qui était ce que je cherchais. HArder passer à la torche, mais sans boucler sur des échantillons. tensorflow a une fonction extract_glimpses qui fonctionne pour l'instant, mais :) – Aleksk89