2011-10-13 16 views
22

मेरे पास 2 डी numpy सरणी है और मेरे पास पंक्तियों और स्तंभों का एक सरणी है जिसे किसी विशेष मान पर सेट किया जाना चाहिए। निम्न उदाहरणलूप के बिना विशिष्ट स्थानों पर 2 डी numpy सरणी को संशोधित करने के लिए कैसे?

a = array([[1, 2, 3], 
      [4, 5, 6], 
      [7, 8, 9]]) 

मैं पंक्तियां [0,2] और स्तंभों [1,2] में प्रविष्टियों को संशोधित करना चाहते पर विचार देता है। यह निम्नलिखित सरणी

a = array([[1, 2, 0], 
      [4, 5, 0], 
      [7, 8, 9]]) 

मैं निम्नलिखित था में परिणाम चाहिए और यह हर पंक्ति

rows = [0,1] 
cols = [2,2] 
b=a[numpy.ix_(rows,columns)] 

यह निम्न सरणी में हुई निर्दिष्ट सरणी

के हर स्तंभ को संशोधित करने में स्तंभ के प्रत्येक अनुक्रम को संशोधित करने के परिणामस्वरूप
array([[1, 0, 0], 
     [4, 5, 6], 
     [7, 0, 0]]) 

कोई मुझे बता सकता है कि यह कैसे करें?

धन्यवाद एक बहुत

संपादित करें: यह है उल्लेखनीय है कि पंक्तियों और स्तंभों संयोग Sequentia होने के लिए happend। वास्तविक बिंदु यह है कि ये मनमाने ढंग से और किसी भी क्रम में हो सकता है। यदि यह पंक्तियां = [ए, बी, सी] और cols = [n x z] है तो मैं स्थानों (ए, एन), (बी, एक्स), (सी, जेड) पर बिल्कुल तीन तत्वों को संशोधित करना चाहता हूं।

उत्तर

16

क्या अन्य लोगों ने कहा करने के लिए जोड़ा जा रहा है, तो आप इस प्रकार इन फैंसी अनुक्रमण का उपयोग कर तत्वों को संशोधित कर सकते हैं: http://docs.scipy.org/doc/numpy/user/basics.indexing.html#indexing-multi-dimensional-arrays

प्रमुख मुद्दा

:

In [39]: rows = [0,1] 

In [40]: cols = [2,2] 

In [41]: a = np.arange(1,10).reshape((3,3)) 

In [42]: a[rows,cols] = 0 

In [43]: a 
Out[43]: 
array([[1, 2, 0], 
     [4, 5, 0], 
     [7, 8, 9]]) 

आप अनुक्रमण बहुआयामी सरणियों पर प्रलेखन पढ़ने के लिए चाहते हो सकता है है:

अगर सूचकांक सरणियों उससे मिलते-जुलते आकार है, और प्रत्येक मंद के लिए एक सूचकांक सरणी है अनुक्रमित होने वाले सरणी के आयन के परिणामस्वरूप, परिणामी सरणी में इंडेक्स सरणी के समान आकार होता है, और मान इंडेक्स सरणी में प्रत्येक स्थिति के लिए इंडेक्स सेट से मेल खाते हैं।

In [60]: a[rows,cols] = np.array([33,77]) 

In [61]: a 
Out[61]: 
array([[ 1, 2, 33], 
     [ 4, 5, 77], 
     [ 7, 8, 9]]) 

जहां प्रत्येक तत्व स्वतंत्र रूप से सेट एक और सरणी, सूची या एक ही आकार के टपल का उपयोग कर सकते हैं:

महत्वपूर्ण बात यह भी आप की तरह काम करने के लिए अनुमति देता है। चारों ओर

+0

आप बहुत सही हैं। प्रलेखन को इंगित करने के लिए धन्यवाद। यह कार्यक्रम में एक बग था। मुझे पता था लेकिन काम नहीं कर सका। आपका जवाब बहुत व्याख्यात्मक है। – Shan

+0

इसके साथ [x] वाक्यविन्यास में क्या चल रहा है? –

+0

@johnktejik यह सिर्फ ipython/jupyter नोटबुक निष्पादन सेल से आउटपुट है। इसके बारे में एक पंक्ति क्रमांकित संकेत के रूप में सोचें। – JoshAdel

2

सबसे पहले, "सही" सरणी स्तंभों और पंक्तियों आपके द्वारा निर्दिष्ट से मेल नहीं खाती अपने विवरण ...

अपने "सही" सरणी पाने के लिए, यदि आप ऐसा करते हैं:

a[:2, 2] = 0 

पहली और तीसरी पंक्तियों के दूसरे और तीसरे कॉलम को संशोधित करने के लिए, (पंक्तियां [0,2] और कॉलम [1,2]) आप जो भी कर रहे हैं वह करेंगे ... (संशोधित करने का आपका विवरण पंक्तियां [0,2] और कॉलम [1,2] वास्तव में आपको मिलने वाला परिणाम है, है ना?)

+1

बिंदु यह है कि मैं इसे अनुक्रमिक नहीं चाहता ... कॉलम और पंक्ति मनमानी संख्या हो सकती है। – Shan

0

यह उतना सरल होना चाहिए एक [0,2] = 0 और एक [1,2] = 0 है। आप एक [0: 2,2] = 0 भी कर सकते हैं। पायथन में ':' आधारित रेंज इंडेक्सिंग आधे खुले अंतराल [0,2) है जो वास्तव में 0 से 1 तक है (2 का अंत बिंदु शामिल नहीं है)।

1

एक काम: ndarray.flatten, np.put(), ndarray.reshape

ndarray.flatten(array) कोशिश, इस तरह आप एक एक मंद सरणी जो numpy.put(array,[indices],[values]) साथ हेरफेर किया जा सकता के साथ काम कर रहे हैं। फिर मूल आयामों को प्राप्त करने के लिए ndarray.reshape() का उपयोग करें।

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