2011-12-22 11 views
8

में लंबे समय तक (> 20 मिलियन तत्व) सरणी सारांश, मैं अजगर और नुकीले के लिए नया हूं इसलिए कृपया मुझे क्षमा करें यदि यह समस्या इतनी प्राथमिक है! मैं नकारात्मक मूल्यों की एक सरणी है (यह सॉर्ट हो जाता है):पाइथन numpy

>>>neg 
[ -1.53507843e+02 -1.53200012e+02 -1.43161987e+02 ..., -6.37326136e-1 -3.97518490e-10 -3.73480691e-10] 
>>>neg.shape 
(12922508,) 

मैं बंटन का मानक विचलन को खोजने के लिए अपने डुप्लीकेट (लेकिन सकारात्मक मूल्यों के साथ) को यह सरणी जोड़ने की जरूरत है शून्य करने के लिए औसत। तो मैं निम्न कार्य करें:

>>>pos=-1*neg 
>>>pos=pos[::-1] #Just to make it look symmetric for the display bellow! 
>>>total=np.hstack((neg,pos)) 
>>>total 
[-153.50784302 -153.20001221 -143.1619873 ..., 143.1619873 153.20001221 153.50784302] 
>>>total.shape 
(25845016,) 

अब तक सब कुछ बहुत अच्छा है, लेकिन अजीब बात यह है कि इस नए सरणी का योग शून्य नहीं है:

>>>numpy.sum(total) 
11610.6 

मानक विचलन भी पर नहीं है सब कुछ जो मैं उम्मीद कर रहा था, लेकिन मुझे लगता है कि उस समस्या की जड़ इस तरह की है: योग का परिणाम शून्य में क्यों नहीं है?

जब मैं इस विधि को एक छोटी सरणी पर लागू करता हूं; उदाहरण के लिए [-5, -3, -2] योग शून्य हो जाता है। तो मुझे लगता है कि समस्या सरणी (20 मिलियन से अधिक तत्वों) की लंबाई में निहित है। क्या इस समस्या से निपटने का कोई तरीका है?

यदि कोई इस पर मेरी सहायता कर सकता है तो मैं सबसे आभारी हूं।

+2

क्या 'math.fsum (कुल) 'वापसी' 0' है? – jfs

+0

हां यह करता है !!! वाह!!! तुम्हारा मतलब है कि मुझे बिल्कुल नम्रता का उपयोग नहीं करना चाहिए था, मैं गलत धारणा में था कि अरेरे पर काम करने के लिए numpy सबसे अच्छा उपकरण है !!! लेकिन http://docs.python.org/py3k/library/math.html#module-math में देखकर मुझे मानक विचलन की गणना के लिए कोई टूल नहीं दिख रहा है। आप क्या प्रस्तावित करेंगे? – makhlaghi

+0

नहीं 'fsum() 'केवल एक सैनिटी जांच के लिए है कि संक्षेपण के दौरान सटीकता को खोने के अलावा आपके कोड में कुछ अन्य बग नहीं है। ['numpy.std()'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html) मानक विचलन के लिए उपयोग किया जा सकता है। 'Np.std (कुल, dtype = np.float64) 'आज़माएं। – jfs

उत्तर

3

जैसा कि टिप्पणियों में उल्लेख किया गया है, आपको कई लाख बराबर हस्ताक्षरित संख्याओं को एकत्र करने से फ्लोट राउंडऑफ समस्याएं मिलती हैं।

neg = -100*numpy.random.rand(20e6) 
pos = -neg 
combined = numpy.zeros(len(neg)+len(pos)) 
combined[::2] = neg 
combined[1::2] = pos 

अब combined.sum() सुंदर के करीब होना चाहिए: यह चारों ओर एक संभव तरीका संयुक्त सरणी में सकारात्मक और नकारात्मक संख्या मिश्रण है, ताकि किसी भी मध्यवर्ती परिणाम है, जबकि हमेशा संक्षेप परिमाण के एक ही आदेश के भीतर लगभग रहना हो सकता है शून्य।

शायद यह दृष्टिकोण मानक विचलन की गणना में सटीकता को बेहतर बनाने में भी मदद करेगा।

+0

योग अब शून्य हो गया है, इसलिए इसका मतलब शून्य भी नहीं था। लेकिन बहुत अजीब चीज यह है कि मानक विचलन पहले से पहले से नहीं बदला था। जब तक 'numpy.std()' योग की गणना करने के लिए किसी अन्य विधि का उपयोग नहीं करता है (उदाहरण के लिए 'math.fsum()' मॉड्यूल में) यह परिणाम स्वीकार्य नहीं है क्योंकि 'numpy.sum()' और 'numpy.mean() 'बदल गया,' numpy.std() 'नहीं किया !!!! – makhlaghi

+1

आपको सूत्रों में सारांश करने के लिए वर्णित तकनीकों का उपयोग करके 'std()' स्वयं को लागू करने की आवश्यकता होगी। –

+0

मैंने 'std()' my self की गणना करने के लिए एक प्रोग्राम लिखा था; 10,000 तत्वों के पैकेज में औसत के साथ प्रत्येक मान का अंतर ढूंढना, परिणामों को जोड़ना और आखिरकार तत्वों की संख्या से विभाजित करना और वर्ग रूट ढूंढना। सभी> 25 मिलियन तत्वों के लिए मानक विचलन की गणना करने में लगभग 15 मिनट लग गए और यह वास्तव में 'numpy.std()' (जो कि एक सेकंड का अंश लिया गया) के समान मूल्य मिला। यह डेटा सेट मेरे एल्गोरिदम का परीक्षण था: जैसा कि मैंने कहा था कि मैं शुरुआत से मानक विचलन जानता था। मैं यह देखने के लिए कि क्या यह सही है या नहीं, उस मानक विचलन के स्रोत की जांच करेगा! – makhlaghi