que tiene una matriz de esta manera:¿Cómo aplicar una máscara en forma de disco a una matriz numpy?
>>> np.ones((8,8))
array([[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.]])
estoy creando una máscara en forma de disco con un radio de 3 así:
y,x = np.ogrid[-3: 3+1, -3: 3+1]
mask = x**2+y**2 <= 3**2
Esto da:
>> mask
array([[False, False, False, True, False, False, False],
[False, True, True, True, True, True, False],
[False, True, True, True, True, True, False],
[ True, True, True, True, True, True, True],
[False, True, True, True, True, True, False],
[False, True, True, True, True, True, False],
[False, False, False, True, False, False, False]], dtype=bool)
Ahora, quiero para poder aplicar esta máscara a mi matriz, usando cualquier elemento como punto central. Así, por ejemplo, con el punto central al (1,1), quiero conseguir una matriz como:
>>> new_arr
array([[ True, True, True, True, 1., 1., 1., 1.],
[ True, True, True, True, True, 1., 1., 1.],
[ True, True, True, True, 1., 1., 1., 1.],
[ True, True, True, True, 1., 1., 1., 1.],
[ 1., True, 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.]])
¿Hay una manera fácil de aplicar esta máscara?
Editar: No debería haber mezclado booleanos y flotadores - fue engañoso.
>>> new_arr
array([[ 255., 255., 255., 255., 1., 1., 1., 1.],
[ 255., 255., 255., 255., 255., 1., 1., 1.],
[ 255., 255., 255., 255., 1., 1., 1., 1.],
[ 255., 255., 255., 255., 1., 1., 1., 1.],
[ 1., 255., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.]])
Esto es más el resultado que requiero.
array [máscara] = 255
enmascararán la matriz mediante punto central (0 + radio, 0 + radio).
Sin embargo, me gustaría poder colocar cualquier máscara de tamaño en cualquier punto (y, x) y hacer que se recorte automáticamente para que quepa.
Funciona ... pero es bastante complicado, con la duplicación de arreglos y cambiando el tipo de letra ... La multiplicación por 0/1 es la manera canónica sugerida por @ 9000. – mac
@mac Sí, estoy de acuerdo. Esperaba obtener algunos comentarios del OP para descubrir qué es lo que realmente está buscando. – jcollado
Lo siento por ser engañoso. Aclaré mi pregunta en mi publicación. Lo que quiero es una forma de obtener los elementos en la matriz original que están cubiertos por la máscara, dado un punto central (y, x) para la máscara. Entonces puedo manipularlos según sea necesario. – user816555