2013-07-09 11 views
7

मैं एक numpy सरणी है के साथ एक numpy सरणी जहां हर मूल्य एक नाव एक पूर्णांक के बाद, उदाहरण के लिए है:बचत मिश्रित डेटा

my_array = numpy.array([0.4324321, 0, 0.9437212, 1, 0.4738721, 0, 0.49327321, 0]) 

मैं इस तरह इसे सहेजने के लिए करना चाहते हैं:

0.4324321 0 0.9437212 1 0.4738721 0 0.49327321 0 

लेकिन अगर मैं फोन:

:

numpy.savetxt('output.dat',my_array,fmt='%f %i') 

मैं कोई त्रुटि मिलती है

AttributeError: fmt has wrong number of % formats. %f %i 

मैं इसे कैसे ठीक कर सकता हूं?

+1

'' savetxt' array' प्रकार का सदस्य नहीं है। क्या आपका मतलब 'numpy.savetxt' था? – abarnert

+0

वैसे, यह वास्तव में मदद करेगा यदि आपने दिखाया कि आप अनुमानित आउटपुट को किस तरह दिखाना चाहते हैं, हमें अनुमान लगाने के बजाय। यह कोई संयोग नहीं है कि कम से कम दो अलग-अलग स्मार्ट लोग आपके दिमाग को पढ़ने में असफल रहे (या शायद दो अलग-अलग स्मार्ट लोग प्लस जो मेरे जैसे ही स्मार्ट हैं; मुझे यकीन नहीं है कि मैंने सही अनुमान लगाया है) ... – abarnert

+0

@abarnert आपकी टिप्पणियों के लिए धन्यवाद, मैंने दोनों समस्याओं को ठीक करने के लिए पोस्ट संपादित किया। – rhombidodecahedron

उत्तर

7

आपकी वास्तविक समस्या यह है कि 1 डी 8-तत्व सरणी को प्रिंट करने से आपको 1 कॉलम की 8 पंक्तियां मिलती हैं (या, यदि आप चीजों को मजबूर करते हैं, 8 कॉलम की 1 पंक्ति), 2 कॉलम की 4 पंक्तियां नहीं। इसलिए, आप केवल एक प्रारूप निर्दिष्ट कर सकते हैं (या, यदि आप चीजों को मजबूर करते हैं, या तो 1 या 8 प्रारूप)।

आप 1x8 के बजाय एक 4x2 आकार में इस उत्पादन करना चाहते हैं, तो आपको पहले सरणी नयी आकृति प्रदान करने की जरूरत है:

numpy.savetxt('output.dat', my_array.reshape((4,2)), fmt='%f %i') 

यह आपको दे देंगे:

0.432432 0 
0.943721 1 
0.473872 0 
0.493273 0 

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


आप 8 स्तंभों की 1 पंक्ति में लिखने के लिए चाहते हैं, तो पहले आप 8 पंक्तियों के बजाय 8 स्तंभों की 1 पंक्ति के साथ कुछ में यह नयी आकृति प्रदान करने की जरूरत है।

और फिर आपको 8 प्रारूप निर्दिष्ट करने की आवश्यकता है। वहाँ कोई रास्ता नहीं numpy बता "इन दोनों प्रारूपों दोहराने चार बार" करने के लिए है, लेकिन वह numpy की मदद के बिना ऐसा करने के लिए बहुत आसान है:

numpy.savetxt('output.dat', my_array.reshape((1,8)), fmt='%f %i ' * 4) 

और है कि आप देता है:

0.432432 0 0.943721 1 0.473872 0 0.493273 0 
+0

असल में मैं 1x8 प्रारूप चाहता हूं। क्या यह प्राप्त करना संभव है? – rhombidodecahedron

+0

1x8, 8x1 नहीं? ठीक है, मैं दिखाऊंगा कि यह कैसे करना है। – abarnert

1

समस्या यह है कि savetxt() होगा प्रत्येक सरणी प्रविष्टि के लिए एक पंक्ति मुद्रित करें। आप एक 2D-array मजबूर एक नई धुरी बनाने सकते हैं और फिर (1x8) प्रारूप प्रिंट:

numpy.savetxt('output.dat', my_array[numpy.newaxis,:], fmt='%f %i'*4) 
संबंधित मुद्दे