2012-09-15 21 views
7

का उपयोग करके numpy सरणी अनुभाग को जगह में संशोधित करें 2 डी numpy सरणी को देखते हुए, यानी;बूलियन इंडेक्सिंग

import numpy as np 

data = np.array([ 
    [11,12,13], 
    [21,22,23], 
    [31,32,33], 
    [41,42,43],   
    ]) 

मुझे इच्छित पंक्तियों और स्तंभों के लिए दो मास्किंग वैक्टरों के आधार पर एक सब-सरणी में संशोधित करने की आवश्यकता है;

rows = np.array([False, False, True, True], dtype=bool) 
cols = np.array([True, True, False], dtype=bool) 

ऐसा है कि i.e .;

print data 

#[[11,12,13], 
# [21,22,23], 
# [0,0,33], 
# [0,0,43]]  

उत्तर

5

Now कि आप कैसे पंक्तियों/कॉलम आप चाहते हैं का उपयोग करने के लिए, बस अपने subarray के लिए मूल्य आप चाहते हैं assigne पता है। यह एक बालक जटिल काम है, हालांकि:

mask = rows[:,None]*cols[None,:] 
data[mask] = 0 

कारण है कि जब हम (data[rows][:,cols] रूप subarray का उपयोग के रूप में अपने previous question में सचित्र, हम एक दृश्य के एक दृश्य ले जा रहे हैं, और मूल डेटा को कुछ संदर्भों मिल रास्ते में खो दिया है।

इसके बजाय, यहाँ हम अपने दो -1 डी सरणियों rows और अन्य के साथ cols एक प्रसारण करके 2D बूलियन सरणी का निर्माण। आपका mask सरणी अब आकार (len(rows),len(cols)। हम mask उपयोग कर सकते हैं सीधे मूल तक पहुँचने के लिए है data के आइटम, और हम उन्हें एक नए मूल्य पर सेट करते हैं। ध्यान दें जब आप data[mask] करते हैं, तो आपको 1 डी सरणी मिलती है, जो आपके previous question में इच्छित उत्तर नहीं था।

मुखौटा निर्माण के लिए, हम * के बजाय & ऑपरेटर इस्तेमाल किया जा सकता था या सरल np.outer समारोह (क्योंकि हम बूलियन सरणियों के साथ काम कर रहे हैं),: @Marcus को रंगमंच की सामग्री:

mask = np.outer(rows,cols) 

संपादित करें np.outer समाधान के लिए जोन्स।

+1

क्या नौकरी है, लेकिन "मास्क = एनपी.उटर (पंक्तियां, कोल्स)" के बारे में कैसे? –

+1

क्या बूलियन इंडेक्सिंग से देखने का कोई तरीका है? उपर्युक्त काम सिर्फ इसलिए है क्योंकि numpy असाइनमेंट का अलग-अलग व्यवहार करता है। 'डेटा [मास्क] 'अभी भी एक दृश्य नहीं है। –

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