2011-01-07 34 views

Respuesta

7
import numpy as np 

a = np.array([[1, 5, 6], 
       [2, 4, 1], 
       [3, 1, 5]]) 

np.ma.MaskedArray(a, mask=(np.ones_like(a)*(a[:,0]==1)).T) 

# Returns: 
masked_array(data = 
[[-- -- --] 
[2 4 1] 
[3 1 5]], 
      mask = 
[[ True True True] 
[False False False] 
[False False False]]) 
2

puede crear la máscara deseada por

mask = numpy.repeat(a[:,0]==1, a.shape[1]) 

y la matriz enmascarado por

masked_a = numpy.ma.array(a, mask=numpy.repeat(a[:,0]==1, a.shape[1])) 
+0

Gracias por la respuesta Sven! Soy nuevo en numpy y no estaba al tanto del método de repetición. Lo buscaré – Curious2learn

0

Usted podría simplemente crear una máscara de vacío y luego usar numpy de radiodifusión (como @eumiro mostró) pero usando el operador "o" de elementos y de bit |:

>>> a = np.array([[1, 5, 6], [2, 4, 1], [3, 1, 5]]) 

>>> mask = np.zeros(a.shape, bool) | (a[:, 0] == 1)[:, None] 

>>> np.ma.array(a, mask=mask) 
masked_array(data = 
[[-- -- --] 
[2 4 1] 
[3 1 5]], 
      mask = 
[[ True True True] 
[False False False] 
[False False False]], 
     fill_value = 999999) 

Un poco más explicaciones:

>>> # select first column 
>>> a[:, 0] 
array([1, 2, 3]) 

>>> # where the first column is 1 
>>> a[:, 0] == 1 
array([ True, False, False], dtype=bool) 

>>> # added dimension so that it correctly broadcasts to the empty mask 
>>> (a[:, 0] == 1)[:, None] 
array([[ True], 
     [False], 
     [False]], dtype=bool) 

>>> # create the final mask 
>>> np.zeros(a.shape, bool) | (a[:, 0] == 1)[:, None] 
array([[ True, True, True], 
     [False, False, False], 
     [False, False, False]], dtype=bool) 

Otra ventaja de este enfoque es que no necesita usar multiplicaciones potencialmente costosos o np.repeat lo que debe ser bastante rápido.

Cuestiones relacionadas