2013-02-13 9 views
5

मेमोरी में numpy arrays कैसे लगाए गए हैं, यह समझना कि मैं numpy का उपयोग करके पायथन में ओपनजीएल बनावट का उपयोग करने का प्रयास कर रहा हूं, लेकिन मैं समस्याओं में भाग रहा हूं क्योंकि मैं भविष्यवाणी नहीं कर सकता कि स्मृति में numpy arrays कैसे व्यवस्थित किया जाएगा। नीचे दिए गए उदाहरण कार्यक्रम (जो चलाना चाहिए के रूप में है) मेरे भ्रम की स्थिति दिखाता है:मेमोरी

from pylab import * 

array_by_hand = array(
    [[[1, 2, 3, 4], [1, 2, 3, 4]], 
    [[1, 2, 3, 4], [1, 2, 3, 4]]], dtype='uint8') 

layers = 1 * ones((2, 2)), 2 * ones((2, 2)), 3 * ones((2, 2)), 4 * ones((2, 2)) 
array_from_layers = dstack(layers) 
array_from_layers = array_from_layers.astype('uint8') 

print array_by_hand; print 
print array_from_layers; print 

print ' '.join(x.encode('hex') for x in array_by_hand.data) 
print ' '.join(x.encode('hex') for x in array_from_layers.data) 
print 
print all(array_by_hand == array_from_layers)     # True 
print str(array_by_hand.data) == str(array_from_layers.data) # False 

हालांकि दो सरणियों जहाँ तक अजगर का संबंध है के बराबर हैं, का स्मृति में अलग तरह से बाहर रखी हैं और इसलिए ओपन से अलग ढंग से दिखाया गया है। क्या कोई यह समझा सकता है कि यह क्यों हो रहा है और मैं एक ही प्रारूप में दोनों सरणी कैसे कर सकता हूं?

उत्तर

4

आप ToString विधि के बजाय फोन है, यह सी-निरंतर लेआउट के लिए सरणी धर्मान्तरित:

>>> array_by_hand.tostring() == array_from_layers.tostring() 
True 

कारण स्ट्रिंग अपने मामले में अलग है dstack कॉल के कारण है। यह स्रोत सरणी के अंतर्निहित डेटा को जोड़कर और फिर numpy's stride information बदलकर सरणी को एक साथ ढेर करने के बारे में स्मार्ट होने का प्रयास करता है। यह सी-संगत लेआउट में नहीं होने वाले सरणी में परिणाम देता है।

+0

यह मुझे आश्चर्यचकित था कि, '.astype (' uint8 ')' चरण में डेटा की प्रतिलिपि बनाते समय, प्रतिलिपि को सी-संगत रूप में पुन: व्यवस्थित नहीं किया गया था। – Jaime

+0

हाँ, मुझे लगता है। स्वादिष्ट अंतर्निहित प्रारूप को वही रखता है। – jterrace

+1

आप जिस स्मृति लेआउट को चाहते हैं उसे सुनिश्चित करने के लिए आप 'np.ascontiguousarray' का भी उपयोग कर सकते हैं ...' .flatten() 'हमेशा आपकी सरणी की प्रतिलिपि बनायेगा, भले ही इसे नहीं करना पड़े। और वास्तव में '.osting()' पहले से ही 'सी' संगत आउटपुट सुनिश्चित करता है। – seberg