Hier ist ein Ansatz mit zeros
Polsterung für Randelemente und mit NumPy strides
mit dem eingebauten in scikit-image
's view_as_windows
für eine effiziente Schiebefenster Extraktion -
from skimage.util import view_as_windows as viewW
def patches(a, patch_shape):
side_size = patch_shape
ext_size = (side_size[0]-1)//2, (side_size[1]-1)//2
img = np.pad(a, ([ext_size[0]],[ext_size[1]]), 'constant', constant_values=(0))
return viewW(img, patch_shape)
Probendurchlauf -
In [98]: a = np.random.randint(0,255,(5,6))
In [99]: a
Out[99]:
array([[139, 176, 141, 172, 192, 81],
[163, 115, 7, 234, 72, 156],
[ 75, 60, 9, 81, 132, 12],
[106, 202, 158, 199, 128, 238],
[161, 33, 211, 233, 151, 52]])
In [100]: out = patches(a, [3,3]) # window size = [3,3]
In [101]: out.shape
Out[101]: (5, 6, 3, 3)
In [102]: out[0,0]
Out[102]:
array([[ 0, 0, 0],
[ 0, 139, 176],
[ 0, 163, 115]])
In [103]: out[0,1]
Out[103]:
array([[ 0, 0, 0],
[139, 176, 141],
[163, 115, 7]])
In [104]: out[-1,-1]
Out[104]:
array([[128, 238, 0],
[151, 52, 0],
[ 0, 0, 0]])
Wenn Sie eine 3D
Array wollen, können Sie eine reshape
am Ende hinzufügen könnte, wie so -
out.reshape(a.shape + (9,))
aber bewusst sein, dass dies eine Kopie statt der schaffen würde Effiziente, schrittweite Ansichten würden wir von der Funktion selbst erhalten.
Wie möchten Sie mit den Grenzelementen umgehen? – Divakar
Ich möchte ein 3D-Array, und Grenze kann entweder auf 0 oder verkleinern – Alvar