2011-01-07 16 views
9

मान लीजिए मैं निम्नलिखित numpy सरणी है:एक स्तंभ में मानों के आधार पर एक 2D numpy सरणी मुखौटा

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

मैं सभी पंक्तियों जो पहले कॉलम में 1 है मुखौटा करना चाहते हैं। यही है, मुझे

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

क्या यह numpy मुखौटा सरणी संचालन का उपयोग करना संभव है? यह कैसे कर सकता है?

धन्यवाद।

उत्तर

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

आप बस एक खाली मुखौटा बनाने और उसके बाद (@eumiro तरह numpy प्रसारण इस्तेमाल कर सकते हैं दिखाया गया) लेकिन तत्व का उपयोग करके- और bitwise "या" ऑपरेटर |:

>>> 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 उपयोग करने के लिए तो यह काफी तेजी से किया जाना चाहिए की जरूरत नहीं है है।

संबंधित मुद्दे