Tengo la siguiente matriz multidimensional:
windows = array([[[[[[0., 0.], [1., 0.]], [[0., 0.], [1., 0.]], [[0., 0.], [1., 0.]]], [[[0., 1.], [0., 0.]], [[0., 1.], [0., 0.]], [[1., 0.], [0., 0.]]], [[[1., 0.], [0., 0.]], [[0., 1.], [0., 0.]], [[0., 1.], [0., 0.]]]]]]) print(windows.shape) (1, 1, 3, 3, 2, 2) # (n, d, a, b, c, c) w = a * (c*c), h = b * (c*c)
Quiero obtener la siguiente matriz resultante:
mask = array([[ [[0., 0., 0., 0., 0., 0.], [1., 0., 1., 0., 1., 0.], [0., 1., 0., 1., 1., 0.], [0., 0., 0., 0., 0., 0.], [1., 0., 0., 1., 0., 1.], [0., 0., 0., 0., 0., 0.]] ]], dtype=np.float32) print(mask.shape) (1, 1, 6, 6) # (n, d, w, h)
Básicamente, quiero comprimir las últimas 4 dimensiones en una matriz bidimensional para que la forma final se convierta en (n, d, w, h), en este caso (1, 1, 6, 6).
np.concatenate(windows, axis = 2)
, pero no se concatenó a lo largo de la segunda dimensión y se redujo por alguna razón primero (aunque configuré axis = 2) 'n' dimensión.
Información adicional:
Windows es el resultado del siguiente fragmento de código
windows = np.lib.stride_tricks.sliding_window_view(arr, (c, c), axis (-2,-1), writeable = True) # arr.shape == mask.shape windows = windows[:, :, ::c, ::c] # these are non-overlapping windows of arr with size (c,c) windows = ... # some modifications of windows
Ahora quiero construir a partir de esta matriz de ventanas con la forma de arr.shape
, esta matriz se llama mask
en el ejemplo anterior. La remodelación simple no funciona porque devuelve los elementos en un orden incorrecto.
IIUC, desea fusionar las dimensiones 2+4 y 3+5, una manera fácil sería intercambiar los swapaxes
4 y 5 (o -3 y -2), y reshape
a (1,1,6,6):
windows.swapaxes(-2,-3).reshape(1,1,6,6)
producción:
array([[[[0., 0., 0., 0., 0., 0.], [1., 0., 1., 0., 1., 0.], [0., 1., 0., 1., 1., 0.], [0., 0., 0., 0., 0., 0.], [1., 0., 0., 1., 0., 1.], [0., 0., 0., 0., 0., 0.]]]])