2012-10-31 19 views
18

पायथन में कोई सरणी प्रकार नहीं है, लेकिन इसे अनुकरण करने के लिए हम सूचियों का उपयोग कर सकते हैं। मैं शून्य के साथ भरा 2 डी सरणी की तरह संरचना चाहता हूँ। मेरा प्रश्न है: क्या, यदि कोई हो, का अंतर है इस दो भाव में:शून्य की 2 डी सरणी

zeros = [[0 for i in xrange(M)] for j in xrange(M)] 

और

zeros = [[0]*M]*N 

zeros ही होगा? गति और पठनीयता के माध्यम से उपयोग करने के लिए कौन सा बेहतर है?

उत्तर

28

आपको numpy.zeros का उपयोग करना चाहिए। यदि यह कोई विकल्प नहीं है, तो आप पहले संस्करण चाहते हैं। दूसरे संस्करण में, यदि आप एक मूल्य बदलने के लिए, इसे कहीं और सूची में बदल जाएगा - उदाहरण के लिए:

>>> a = [[0]*10]*10 
>>> a 
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] 
>>> a[0][0] = 1 
>>> a 
[[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]] 

इसका कारण यह है (जैसा कि आप अंदर बाहर से अभिव्यक्ति पढ़ने के लिए), आप की एक सूची बना 10 शून्य फिर आप 10 शून्य की प्रारंभिक सूची में 10 संदर्भों की एक सूची बनाते हैं।


ध्यान दें कि:

zeros = [ [0]*M for _ in xrange(N) ] 

भी काम करेंगे और यह नेस्टेड सूची समझ से बचा जाता है। यदि numpy तालिका पर नहीं है, तो यह वह रूप है जिसका मैं उपयोग करूंगा।

+0

यह है कि एक सुविधा के लिए बस numpy उपयोग करने के लिए वास्तव में आवश्यक है के एम एक्स एन सरणी के लिए? पहले संस्करण के लिए +1। – John

+1

@johnthexiii - संभवतः नहीं। लेकिन, यदि ओपी शून्य की 2 डी सरणी चाहता है, तो मैं एक अंग पर बाहर जाने के लिए तैयार हूं और कहूंगा कि ओपी का कोड शायद अन्य स्थानों में भी खराब हो सकता है। – mgilson

+0

मैं सूची को शून्य करने के लिए numpy इंस्टॉल नहीं करूंगा;) बाद में स्पष्टीकरण के लिए धन्यवाद, यह वही था जो मैं ढूंढ रहा था। – yakxxx

2

दूसरे मामले में आप एक ही सूची में संदर्भों की सूची बनाते हैं। यदि आपके पास कोड है: [lst] * एन जहां lst एक सूची का संदर्भ है, तो आपके पास निम्न सूची होगी: [lst, lst, lst, lst, ..., lst]। लेकिन क्योंकि परिणाम सूची में एक ही ऑब्जेक्ट का संदर्भ होता है, यदि आप एक पंक्ति में मान बदलते हैं तो यह अन्य सभी पंक्तियों में बदल जाएगा।

7
अजगर 3 (कोई और अधिक xrange) के लिए

, वरीय जवाब

zeros = [ [0] * N for _ in range(M)] 

शून्य

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