Given a 2D array, I would like to create a 3D array where the values along the third dimension at (i.e. stacked[row, col, :]
) are the flattened
This could be one approach -
import numpy as np
# Parameters
R = 3 # Radius
M1,N1 = padded.shape
rowlen = N1 - R + 1
collen = M1 - R + 1
# Linear indices for the starting R x R block
idx1 = np.arange(R)[:,None]*N1 + np.arange(R)
# Offset (from the starting block indices) linear indices for all the blocks
idx2 = np.arange(collen)[:,None]*N1 + np.arange(rowlen)
# Finally, get the linear indices for all blocks
all_idx = idx1.ravel()[None,None,:] + idx2[:,:,None]
# Index into padded for the final output
out = padded.ravel()[all_idx]
Here's a sample run for radius, R = 4
-
In [259]: padded
Out[259]:
array([[ 5, 5, 0, 3, 3, 3],
[ 5, 5, 0, 3, 3, 3],
[ 7, 7, 9, 3, 5, 5],
[ 2, 2, 4, 7, 6, 6],
[ 8, 8, 8, 10, 1, 1],
[ 6, 6, 7, 7, 8, 8],
[ 6, 6, 7, 7, 8, 8]])
In [260]: out
Out[260]:
array([[[ 5, 5, 0, 3, 5, 5, 0, 3, 7, 7, 9, 3, 2, 2, 4, 7],
[ 5, 0, 3, 3, 5, 0, 3, 3, 7, 9, 3, 5, 2, 4, 7, 6],
[ 0, 3, 3, 3, 0, 3, 3, 3, 9, 3, 5, 5, 4, 7, 6, 6]],
[[ 5, 5, 0, 3, 7, 7, 9, 3, 2, 2, 4, 7, 8, 8, 8, 10],
[ 5, 0, 3, 3, 7, 9, 3, 5, 2, 4, 7, 6, 8, 8, 10, 1],
[ 0, 3, 3, 3, 9, 3, 5, 5, 4, 7, 6, 6, 8, 10, 1, 1]],
[[ 7, 7, 9, 3, 2, 2, 4, 7, 8, 8, 8, 10, 6, 6, 7, 7],
[ 7, 9, 3, 5, 2, 4, 7, 6, 8, 8, 10, 1, 6, 7, 7, 8],
[ 9, 3, 5, 5, 4, 7, 6, 6, 8, 10, 1, 1, 7, 7, 8, 8]],
[[ 2, 2, 4, 7, 8, 8, 8, 10, 6, 6, 7, 7, 6, 6, 7, 7],
[ 2, 4, 7, 6, 8, 8, 10, 1, 6, 7, 7, 8, 6, 7, 7, 8],
[ 4, 7, 6, 6, 8, 10, 1, 1, 7, 7, 8, 8, 7, 7, 8, 8]]])