2012-02-02 9 views
15

के numpy recarray तारों को एक तारकीय पुनरावृत्ति शुरू करना संभव है जो पहले तारों की लंबाई को जानने के बिना तारों को पकड़ लेगा?परिवर्तनीय लंबाई

एक (काल्पनिक) उदाहरण के रूप में:

mydf = np.empty((numrows,), dtype=[ ('file_name','STRING'), ('file_size_MB',float) ]) 

समस्या यह है कि मैं जानकारी के साथ यह आबाद करने का पहले से मेरी recarray निर्माण कर रहा हूँ है, और मैं जरूरी अग्रिम में file_name की अधिकतम लंबाई पता नहीं है ।

मेरे सभी प्रयास स्ट्रिंग क्षेत्र में परिणाम छोटा कर दिया जा रहा है:

>>> mydf = np.empty((2,), dtype=[('file_name',str),('file_size_mb',float)]) 
>>> mydf['file_name'][0]='foobarasdf.tif' 
>>> mydf['file_name'][1]='arghtidlsarbda.jpg' 
>>> mydf 
array([('', 6.9164002347457e-310), ('', 9.9413127e-317)], 
     dtype=[('file_name', 'S'), ('file_size_mb', '<f8')]) 
>>> mydf['file_name'] 
array(['f', 'a'], 
     dtype='|S1') 

(एक अलग रूप में, के रूप में क्यों mydf['file_name'] शो 'एफ' और 'एक' जबकि mydf शो '' और '' करता है?)

इसी तरह, अगर मैं के लिए प्रकार (माना) |S10 साथ आरंभ file_name तो बातें लंबाई 10

केवल समान प्रश्न मैं मिल सकता है this one है, लेकिन इस calcu में काट उपयुक्त स्ट्रिंग लम्बाई एक प्राथमिक लेटती है और इसलिए मेरा उतना ही नहीं है (जैसा कि मुझे पहले से कुछ भी पता नहीं है)।

क्या file_name (उदाहरण के लिए) |S9999999999999 (यानी कुछ हास्यास्पद ऊपरी सीमा) के साथ कोई अन्य विकल्प है?

+0

यह एक अच्छा सवाल है। रिकॉर्ड्स में लंबाई 0 स्ट्रिंग्स ने मुझे अपने बालों को आधे घंटे तक फाड़ दिया था! – Christoph

उत्तर

24

STRING प्रकार का उपयोग करने के बजाय, कोई भी हमेशा object का उपयोग dtype के रूप में कर सकता है। इससे किसी ऑब्जेक्ट को किसी सरणी तत्व को असाइन किया जा सकता है, जिसमें पायथन चर लंबाई लंबाई शामिल है। उदाहरण के लिए:

>>> import numpy as np 
>>> mydf = np.empty((2,), dtype=[('file_name',object),('file_size_mb',float)]) 
>>> mydf['file_name'][0]='foobarasdf.tif' 
>>> mydf['file_name'][1]='arghtidlsarbda.jpg' 
>>> mydf 
array([('foobarasdf.tif', 0.0), ('arghtidlsarbda.jpg', 0.0)], 
     dtype=[('file_name', '|O8'), ('file_size_mb', '<f8')]) 

यह सरणी अवधारणा की भावना के खिलाफ एक चर लंबाई तत्वों के लिए है, लेकिन इस के रूप में एक मिल सकता है के रूप में करीब है। सरणी का विचार यह है कि तत्व स्मृति में अच्छी तरह से परिभाषित और नियमित रूप से दूरी वाले स्मृति पते पर संग्रहीत होते हैं, जो परिवर्तनीय लंबाई तत्वों को प्रतिबंधित करते हैं। पॉइंटर्स को एक सरणी में स्ट्रिंग में संग्रहीत करके, कोई भी इस सीमा को बाधित कर सकता है। (यह मूल रूप से उपर्युक्त उदाहरण है।)

+0

इसके लिए धन्यवाद - मैं बस आर भाषा से स्थानांतरित हो रहा हूं और मूल रूप से डेटा फ्रेम प्रकार की वस्तु चाहता था, और यह बहुत अच्छा काम करता है! –

+3

देर टिप्पणी: यदि आप आर से आगे बढ़ रहे हैं, तो पांडा पर विचार करें। डेटाफ्रेम ऑब्जेक्ट, जो आपको बहुत परिचित लग रहा है और तारों को अच्छी तरह से संभालता है। – mdurant