2009-06-22 17 views
8

में दशमलव संरेखण स्वरूपण यह होना चाहिए।पाइथन

यहाँ मेरी सरणी (बल्कि, प्रतिनिधि परीक्षण सरणियों पैदा करने की एक विधि) है:

>>> ri = numpy.random.randint 
>>> ri2 = lambda x: ''.join(ri(0,9,x).astype('S')) 
>>> a = array([float(ri2(x)+ '.' + ri2(y)) for x,y in ri(1,10,(10,2))]) 
>>> a 
array([ 7.99914000e+01, 2.08000000e+01, 3.94000000e+02, 
     4.66100000e+03, 5.00000000e+00, 1.72575100e+03, 
     3.91500000e+02, 1.90610000e+04, 1.16247000e+04, 
     3.53920000e+02]) 

मैं कहाँ '\ n'.join स्ट्रिंग की एक सूची चाहते हैं (list_o_strings) मुद्रित होगा:

79.9914 
    20.8 
    394.0 
4661.0 
    5.0 
1725.751 
    391.5 
19061.0 
11624.7 
    353.92 

मैं बाएं और पर स्पेस पैड करना चाहता हूं (लेकिन आवश्यक से अधिक नहीं)।

मैं दशमलव के बाद शून्य चाहता हूं यदि यह दशमलव के बाद है।

मुझे वैज्ञानिक नोटेशन नहीं चाहिए।

.. और मैं कोई महत्वपूर्ण अंक खोना नहीं चाहता हूं। (353.98000000000002 में 2 महत्वपूर्ण नहीं है)

हाँ, यह ..

अजगर 2.5 के %g, %fx.x, आदि या तो मुझे befuddling रहे हैं अच्छा है, या यह नहीं कर सकते। मैंने अभी तक import decimal का प्रयास नहीं किया है। मैं NumPy यह या तो करता है कि (हालांकि, array.__str__ और array.__repr__ दशमलव गठबंधन कर रहे हैं (लेकिन कभी कभी वैज्ञानिक वापसी) नहीं देख सकता।

ओह, और गति में गिना जाता है। मैं बड़ा सरणियों के साथ यहां काम कर रहा हूँ।

मेरे वर्तमान समाधान दृष्टिकोण हैं: ('।')

  1. str (क) और सरणी और विभाजन में प्रत्येक तत्व NumPy के कोष्ठक बंद पार्स
  2. str के लिए (ई) तो पैड और फिर से संगठित
  3. से a.astype ('एस' + str (i)) जहां मैं अधिकतम (लेन (str (ए)) है, तो पैड

ऐसा लगता है कि कुछ ऑफ-द-शेल्फ होना चाहिए समाधान वहाँ बाहर ... (लेकिन आवश्यक नहीं)

शीर्ष सुझाव जब dtype float64 है के साथ विफल:

>>> a 
array([ 5.50056103e+02, 6.77383566e+03, 6.01001513e+05, 
     3.55425142e+08, 7.07254875e+05, 8.83174744e+02, 
     8.22320510e+01, 4.25076609e+08, 6.28662635e+07, 
     1.56503068e+02]) 
>>> ut0 = re.compile(r'(\d)0+$') 
>>> thelist = [ut0.sub(r'\1', "%12f" % x) for x in a] 
>>> print '\n'.join(thelist) 
    550.056103 
6773.835663 
601001.513 
355425141.8471 
707254.875038 
    883.174744 
    82.232051 
425076608.7676 
62866263.55 
    156.503068 
+0

कृपया कोड पोस्ट करें जो काम नहीं करता है। –

उत्तर

9

क्षमा करें, लेकिन संपूर्ण जांच के बाद मैं काम की आवश्यकता को करने के लिए किसी भी तरह से नहीं मिल सकता है कम से कम पोस्ट-प्रोसेसिंग के बिना (पीछे वाले शून्यों को बंद करने के लिए जिन्हें आप देखना नहीं चाहते हैं); की तरह कुछ:

import re 
ut0 = re.compile(r'(\d)0+$') 

thelist = [ut0.sub(r'\1', "%12f" % x) for x in a] 

print '\n'.join(thelist) 

तेजी से और संक्षिप्त है, लेकिन जा रहा है "ऑफ-द-शेल्फ" की अपनी बाधा टूट जाता है - यह है, बजाय, सामान्य स्वरूपण की एक मॉड्यूलर संयोजन (जो लगभग आप क्या चाहते हैं, लेकिन पत्तियों करता है पिछला पिछला भाग जिसे आप छिपाना चाहते हैं) और अवांछित पिछला शून्य हटाने के लिए एक आरई। व्यावहारिक रूप से, मुझे लगता है कि यह वही करता है जो आपको चाहिए, लेकिन आपकी शर्तों के अनुसार कहा गया है, मुझे विश्वास है, अधिक बाधित है।

संपादित: मूल प्रश्न अधिक महत्वपूर्ण अंक निर्दिष्ट करने के लिए संपादित किया गया था, क्या सबसे बड़ी संख्या के लिए आवश्यक है परे कोई अतिरिक्त प्रमुख स्थान की आवश्यकता है, और एक नया उदाहरण (जहां मेरे पिछले सुझाव है, इसके बाद के संस्करण, वांछित से मेल नहीं खाता प्रदान उत्पादन)। अग्रणी व्हाइटस्पेस को हटाने का काम जो स्ट्रिंग्स के समूह के लिए आम है, textwrap.dedent के साथ सबसे अच्छा प्रदर्शन किया जाता है - लेकिन यह एक स्ट्रिंग (न्यूलाइन के साथ) पर काम करता है जबकि आवश्यक आउटपुट तारों की एक सूची होती है। कोई बात नहीं, हम सिर्फ एक साथ लाइनों डाल देता हूँ, उन्हें dedent, और उन्हें फिर से विभाजित:

import re 
import textwrap 

a = [ 5.50056103e+02, 6.77383566e+03, 6.01001513e+05, 
     3.55425142e+08, 7.07254875e+05, 8.83174744e+02, 
     8.22320510e+01, 4.25076609e+08, 6.28662635e+07, 
     1.56503068e+02] 

thelist = textwrap.dedent(
     '\n'.join(ut0.sub(r'\1', "%20f" % x) for x in a)).splitlines() 

print '\n'.join(thelist) 

का उत्सर्जन करता है:

 550.056103 
    6773.83566 
    601001.513 
355425142.0 
    707254.875 
     883.174744 
     82.232051 
425076609.0 
62866263.5 
     156.503068 
+0

मैं गारंटी नहीं दे सकता कि% 12f महत्वपूर्ण अंक खो नहीं पाएगा। (मैंने एक संपादन किया और इस तरह से प्रतिबिंबित करने के लिए मेरे टेस्ट एरे उत्पन्न किए गए तरीके को बदल दिया।) यदि मैं गारंटी देने के लिए% 20 या उससे अधिक तक बढ़ता हूं, तो बाईं ओर बस बहुत अधिक पैडिंग होती है। (सबसे बड़ा मूल्य चाहते हैं कि कोई प्रमुख स्थान न हो) मैं बैक-ऑफ-द-अलबोर्ड समाधान भी ले जाऊंगा! – Paul

2

अजगर स्ट्रिंग स्वरूपण दोनों ही आवश्यक दशमलव प्रिंट कर सकते हैं (साथ % जी) या decimals के एक निश्चित सेट का उपयोग करें (% एफ के साथ)। हालांकि, आप केवल आवश्यक दशमलव मुद्रित करना चाहते हैं, सिवाय इसके कि संख्या एक पूर्ण संख्या है, तो आप एक दशमलव चाहते हैं, और यह जटिल बनाता है।

इसका मतलब है आप की तरह कुछ के साथ खत्म होगा: यह पहला, या तो 1 दशमलव के साथ एक स्ट्रिंग पैदा करेगा अगर मान एक पूर्णांक है

def printarr(arr): 
    for x in array: 
     if math.floor(x) == x: 
      res = '%.1f' % x 
     else: 
      res = '%.10g' % x 
     print "%*s" % (15-res.find('.')+len(res), res) 

, या यह स्वचालित दशमलव के साथ प्रिंट होगा (लेकिन केवल 10 संख्या तक) यदि यह एक आंशिक संख्या नहीं है। आखिरकार यह इसे प्रिंट करेगा, समायोजित किया जाएगा ताकि दशमलव बिंदु गठबंधन किया जा सके।

शायद, वास्तव में, numpy वास्तव में आप जो चाहते हैं वह करता है, क्योंकि आप आमतौर पर यह लंबे समय तक घातीय मोड में होना चाहते हैं।