2011-02-05 14 views
5

क्या पाइथन में विभिन्न प्रकार के बहु-आयामी सरणी बनाना संभव है? जिस तरह से मैं इसे हल करता हूं वह [([None] * n) for i in xrange(m)] है, लेकिन मैं list का उपयोग नहीं करना चाहता हूं। मुझे ऐसा कुछ चाहिए जो वास्तव में स्मृति में पॉइंटर्स की निरंतर श्रृंखला है, सूची नहीं। (प्रत्येक सूची स्वयं निरंतर है, लेकिन जब आप सूचियों की सूची बनाते हैं, तो विभिन्न सूचियों को रैम में विभिन्न स्थानों में फैलाया जा सकता है।)पायथन: विभिन्न प्रकारों की बहु-आयामी सरणी

इसके अलावा, [([None] * n) for i in xrange(m)] लिखना एक खाली सरणी शुरू करने का एक ठोस तरीका है, इसके विपरीत empty_array(m, n) जैसे कुछ के लिए। क्या कोई बेहतर विकल्प है?

+0

जैसा कि पहले कहा गया है, यह ऐसा विचार नहीं है जिसे आप करना चाहते हैं। कार्य करें जो आप करना चाहते हैं (और हमें बताएं) और हम इसके लिए डेटा संरचना को परिभाषित करने में आपकी सहायता करेंगे। लेकिन पाइथन के बारे में महान चीजों में से एक यह है कि आपको सी – katrielalex

उत्तर

3

यदि आप numpy का उपयोग कर रहे हैं, मौके से, numpy ऑब्जेक्ट सरणी "स्मृति में पॉइंटर्स के निरंतर सरणी" हैं।

हालांकि, वे NumPy सरणी के सामान्य उद्देश्य विफल, और अक्सर हाथ में समस्या के लिए एक बुरा जवाब ...

(एक ही प्रकार के सन्निहित स्मृति जा रहा है हवा - पूरे पर> तेजी से गणना सरणी ... ऑब्जेक्ट एरे इस की अनुमति नहीं देते हैं, क्योंकि वे पॉइथन ऑब्जेक्ट्स के पॉइंटर्स के सरणी हैं।)।

फिर भी, np.empty((m,n), dtype=np.object) जो आप चाहते हैं वह करता है।

उदा।

x = np.empty((3,4), dtype=np.object) 
print x 
x[2,3] = range(5) 
x[1,2] = 2 
x[1,3] = (item*2 for item in xrange(10)) 
print x 

पैदावार कौन सा:

Initial array: 
[[None None None None] 
[None None None None] 
[None None None None]] 

Modified array: 
[[None None None None] 
[None None 2 <generator object <genexpr> at 0x8700d9c>] 
[None None None [0, 1, 2, 3, 4]]] 

बस ध्यान रखें कि यह बहुत धीमी होने के लिए जा रहा है हो सकता है और "सामान्य" NumPy सरणी से काफी कम स्मृति कुशल! (यानी एक None ऑब्जेक्ट भी एक (numpy, python) फ्लोट की तुलना में काफी मेमोरी लेता है, और आपको सरणी में संग्रहीत पॉइंटर का अतिरिक्त ओवरहेड मिला है। एक बड़ी ऑब्जेक्ट सरणी बहुत मेमोरी का उपयोग करेगी!)

हालांकि, यदि आपको जो चाहिए वह प्रभावी रूप से एक बहु-आयामी सूची है, और आप इसे जोड़ने या उसके आकार को अक्सर बदलने के लिए नहीं जा रहे हैं, तो उन्हें सुविधाजनक रूप से शापित किया जा सकता है। वे अनिवार्य रूप से मैटलैब के सेल सरणी के बराबर होने के लिए हैं, और जबकि पाइथन (पायथन की सूचियां हैं) में उस तरह की डेटा संरचना की आवश्यकता कम है, कभी-कभी यह आसान है!

2

कई मामलों में ऐसे सरणी की आवश्यकता नहीं है क्योंकि इन समस्याओं के अधिक सुरुचिपूर्ण समाधान हैं। समझाओ कि आप क्या करना चाहते हैं ताकि कोई कुछ संकेत दे सके।

वैसे भी, अगर आप वास्तव में, वास्तव में इस तरह के डेटा संरचना की जरूरत है, array.array का उपयोग करें।

+0

जैसी सभी निम्न-स्तरीय मेमोरी सामग्री के बारे में चिंता करने की ज़रूरत नहीं है क्या आपने पुष्टि की है कि 'array.array' आपके पोस्ट करने से पहले एक सरणी में विभिन्न प्रकार की ऑब्जेक्ट्स को अनुमति देता है का जवाब? –

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