2011-01-07 2 views
9

Предположим, что у меня есть следующий Numpy массив:маскировать Numpy массив 2D на основе значений в одном столбце

a = [[1, 5, 6], 
    [2, 4, 1], 
    [3, 1, 5]] 

Я хочу, чтобы скрыть все строки, которые имеют 1 в первом столбце. То есть, я хочу

[[--, --, --], 
    [2, 4, 1], 
    [3, 1, 5]] 

Возможно ли это с помощью операций с массивом в виде масок? Как это можно сделать?

Спасибо.

ответ

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

Вы можете создать нужную маску

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

и замаскированный массив по

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

Спасибо за ответ Свен! Я новичок в numpy и не знал о методе повтора. Посмотрим. – Curious2learn

0

Вы можете просто создать пустую маску, а затем использовать NumPy-вещание (как @eumiro), но с использованием элемента и побитового «или» оператора |:

>>> 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) 

немного дальше объяснение: далее

>>> # 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) 

Одним из преимуществ такого подхода заключается в том, что не нужно использовать потенциально дорогие умножений или np.repeat поэтому она должна быть достаточно быстро.

Смежные вопросы