Modifique la sección de matriz numpy en el lugar utilizando la indexación booleana

Dada una matriz numpy 2D, es decir;

import numpy as np data = np.array([ [11,12,13], [21,22,23], [31,32,33], [41,42,43], ]) 

Necesito modificar en su lugar una sub-matriz basada en dos vectores de enmascaramiento para las filas y columnas deseadas;

 rows = np.array([False, False, True, True], dtype=bool) cols = np.array([True, True, False], dtype=bool) 

Tal que es decir;

 print data #[[11,12,13], # [21,22,23], # [0,0,33], # [0,0,43]] 

Ahora que ya sabe cómo acceder a las filas / cols que desea, simplemente asigne el valor que desea a su subarray. Es un poco más complicado, sin embargo:

 mask = rows[:,None]*cols[None,:] data[mask] = 0 

La razón es que cuando accedemos al subarreglo como data[rows][:,cols] (como se ilustra en su pregunta anterior , estamos tomando una vista de una vista, y algunas referencias a los datos originales se pierden en el camino.

En su lugar, aquí construimos una matriz booleana 2D al transmitir sus dos rows matrices 1D y una con la otra. La matriz de su mask ahora tiene la forma (len(rows),len(cols) . Podemos usar la mask para acceder directamente a los elementos de data originales, y los establecemos en un nuevo valor. Tenga en cuenta que cuando haga data[mask] , obtienes una matriz 1D, que no era la respuesta que querías en tu pregunta anterior .

Para construir la máscara, podríamos haber usado el operador & lugar de * (porque estamos tratando con matrices booleanas), o la función np.outer más np.outer :

 mask = np.outer(rows,cols) 

Edición: apoyos a @Marcus Jones para la solución np.outer .