Cambiando la estructura de la matriz numpy aplicando un valor dado

¿Cómo puedo reducir la escala de los datos de ttwig de tamaño 4 X 6 tamaño de 2 X 3 haciendo que se elija ‘1’ si cualquier elemento con 2 * 2 píxeles incluye 1, de lo contrario 0?

 import numpy as np data=np.array([ [0,0,1,1,0,0], [1,0,0,1,0,0], [1,0,1,0,0,0], [1,1,0,0,0,0]]) 

El resultado debe ser:

 result = np.array([ [1,1,0], [1,1,0]]) 

Puede usar la rutina de extracción de parches de scikit learn de la siguiente manera (debería poder copiar y pegar):

 from sklearn.feature_extraction.image import extract_patches data = np.array([[0, 0, 1, 1, 0, 0], [1, 0, 0, 1, 0, 0], [1, 0, 1, 0, 0, 0], [1, 1, 0, 0, 0, 0]]) patches = extract_patches(data, patch_shape=(2, 2), extraction_step=(2, 2)) non_zero_count_patches = (patches > 0).any(axis=-1).any(axis=-1).astype(int) print non_zero_count_patches 

Explicación : la función extract_patches genera una vista en su matriz que representa parches deslizantes de tamaño patch_shape y del paso de discretización extract_patches , que puede variar según lo desee. La siguiente línea verifica cuál de los parches contiene un elemento distinto de cero. Sin embargo, esto puede ser reemplazado por cualquier otra cosa que le interese, como la media, la sum, etc. Una ventaja es que puede elegir el tamaño del parche y el paso de extracción libremente (no es necesario que correspondan), sin sobrecarga de memoria hasta Se invoca any (usa pasos internos).

 import numpy as np def toblocks(arr, nrows, ncols): h, w = arr.shape blocks = (arr.reshape(h // nrows, nrows, -1, ncols) .swapaxes(1, 2) .reshape(h // nrows, w // ncols, ncols * nrows)) return blocks data = np.array([[0, 0, 1, 1, 0, 0], [1, 0, 0, 1, 0, 0], [1, 0, 1, 0, 0, 0], [1, 1, 0, 0, 0, 0]]) blocks = toblocks(data, 2, 2) downscaled = blocks.any(axis=-1).astype(blocks.dtype) print(downscaled) # [[1 1 0] # [1 1 0]] 

De dónde proviene la solución anterior: Hace un tiempo, una pregunta SO preguntó cómo dividir una matriz en bloques. Todo lo que hice fue modificar ligeramente esa solución para aplicar any de los bloques.