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
.