प्रीलोकेट और भरें। इसने मेरे रनटाइम फॉर्म को लगभग 1000 सेकंड से 20 सेकंड
data_stack = numpy.empty((321, 720, 1000), dtype=numpy.float32)
for index in range(len(data)):
data_stack[0:321,0:720,index] = data[index]
मैं कुछ ऐसा ही कर रहा था। डस्टैक इस समस्या का अच्छा समाधान नहीं है। एक सहयोगी ने मुझे गतिशील सरणी समस्या और अमूर्त विश्लेषण की याद दिला दी। http://anh.cs.luc.edu/363/notes/06A_Amortizing.html
जब आप एक गतिशील सरणी का विस्तार करना चाहते हैं, तो आपको एक नया सरणी आवंटित करने की आवश्यकता है जो मूल डेटा और नया डेटा रख सके। फिर आप पुरानी सरणी को नई सरणी में और नए डेटा को नए सरणी में कॉपी करते हैं। यह एक महंगा ऑपरेशन है।
मान लें कि आपके पास आकार 10 की एक सरणी है और आप एक समय में 2 आइटम जोड़ना चाहते हैं। पहले आइटम को जोड़ने के लिए आपको सरणी को आकार 11 में विस्तारित करने और 11 आइटम (मूल 10 + 1 नई आइटम) में कॉपी करने की आवश्यकता है। दूसरी वस्तु को जोड़ने के लिए आपको सरणी को आकार 12 में विस्तारित करने और 12 आइटमों में प्रतिलिपि बनाने की आवश्यकता है। यदि आप समय से पहले जानते थे कि आप 2 आइटम जोड़ रहे थे तो आप शुरू करने के लिए सरणी को 12 में बदल सकते थे और केवल 23 आइटमों की बजाय 12 आइटम कॉपी कर सकते थे। यह पता चला है कि प्रत्येक बार जब आप बाहर निकलते हैं तो सरणी के आकार को दोगुना करना अंतरिक्ष का एक और अधिक कुशल समाधान है।
यह कैसे लागू होता है: dstack ndarray के आकार को दोगुना नहीं करता है, इसका मतलब केवल आवश्यक स्मृति जितना आवंटित करना है। तो हर बार जब आप डस्टैक को कॉल करते हैं तो आप अपने डेटा में अपने सभी डेटा को नए डेटा के लिए स्पेस के साथ एक नए ndarray में कॉपी कर रहे हैं। ध्यान दें कि प्रत्येक कॉल के साथ बढ़ने का समय।
स्रोत
2013-09-13 19:52:59
कोई मौका आप हमें कुछ कोड दिखा सकते हैं? – arshajii
उन्हें डस्टैक क्यों करें? एक लूप में प्रत्येक पर आंकड़ों की गणना क्यों न करें? – mgilson
@mgilson: पाइथन में फॉर-लूप धीमे होते हैं, यदि वह धुरी कीवर्ड का उपयोग करता है, तो वह फॉर-लूप को नीचे (सी) तक धक्का दे सकता है, जो – usethedeathstar