2016-07-25 7 views
7

मुद्दापायथन- np.mean() गलत साधन दे रहे हैं?

तो मैं 50 netCDF4 डेटा फ़ाइलों है कि एक वैश्विक ग्रिड पर मासिक तापमान भविष्यवाणियों के दशकों शामिल है। मैं np.mean() का उपयोग कर रहा हूं ताकि समय की लंबाई & स्थानिक पैमाने को संरक्षित करते हुए सभी 50 डेटा फ़ाइलों का एक साथ मिलकर औसत हो, लेकिन np.mean() मुझे दो अलग-अलग उत्तर देता है। पहली बार जब मैं कोड का अपना ब्लॉक चलाता हूं, तो यह मुझे एक संख्या देता है, जब अक्षांश & देशांतर & पर व्यक्तिगत रनों के खिलाफ प्लॉट किया गया है, जो कि समानता के मतलब से थोड़ा कम है। अगर मैं ब्लॉक को फिर से चलाता हूं, तो यह मुझे एक अलग अर्थ देता है जो सही दिखता है।

कोड

मैं हर पंक्ति यहाँ कॉपी नहीं कर सकते, क्योंकि यह लंबे समय से है, लेकिन यहाँ क्या मैं एक रन के लिए करते हैं।

#Historical (1950-2020) data 
ncin_1 = Dataset("/project/wca/AR5/CanESM2/monthly/histr1/tas_Amon_CanESM2_historical-r1_r1i1p1_195001-202012.nc") #Import data file 
tash1 = ncin_1.variables['tas'][:] #extract tas (temperature) variable 
ncin_1.close() #close to save memory 

#Repeat for future (2021-2100) data 
ncin_1 = Dataset("/project/wca/AR5/CanESM2/monthly/histr1/tas_Amon_CanESM2_historical-r1_r1i1p1_202101-210012.nc") 
tasr1 = ncin_1.variables['tas'][:] 
ncin_1.close() 

#Concatenate historical & future files together to make one time series array 
tas11 = np.concatenate((tash1,tasr1),axis=0) 

#Subtract the 1950-1979 mean to obtain anomalies 
tas11 = tas11 - np.mean(tas11[0:359],axis=0,dtype=np.float64) 

और मैं अन्य डेटासेट के लिए 49 गुना अधिक दोहराता हूं। प्रत्येक tas11, tas12, आदि फ़ाइल में आकार, अक्षांश, और देशांतर में समय की लंबाई के अनुरूप आकार (1812, 64, 128) होता है।

सम्मिलित करने के लिए, मैं निम्नलिखित करता हूं।

#Move all tas data to one array 
alltas = np.zeros((1812,64,128,51)) #years, lat, lon, members (no ensemble mean value yet) 
alltas[:,:,:,0] = tas11 
(...) 
alltas[:,:,:,49] = tas50 

#Calculate ensemble mean & fill into 51st slot in axis 3 
alltas[:,:,:,50] = np.mean(alltas,axis=3,dtype=np.float64) 

जब मैं एक समन्वय & महीने, कलाकारों की टुकड़ी मतलब यह क्या किया जाना चाहिए से बंद है की जाँच करें। यहाँ 1950-2100 से विश्व स्तर पर औसतन तापमान के बढ़ने की साजिश पहले मतलब (साथ monhly मूल्यों वार्षिक मूल्यों में औसतन साथ कैसा दिखता है। काले लाइन है कलाकारों की टुकड़ी मतलब & रंग लाइनों व्यक्तिगत रूप से रन कर रहे हैं।

enter image description here

जाहिर है कि असली पहनावा के नीचे विचलित मतलब है। जब मैं alltas चलाता हूं तो साजिश कैसा दिखता है [:,:,:, 50] = np.mean (alltas, axis = 3, dtype = np.float64) दूसरी बार & बाकी सब कुछ रखें वही।

enter image description here

बहुत बेहतर है।

सवाल

क्यों np.mean() गलत मान पहली बार की गणना? मैंने इस प्रश्न में np.mean() का उपयोग करते समय डेटा प्रकार को फ्लोट के रूप में निर्दिष्ट करने का प्रयास किया- Wrong numpy mean value? लेकिन यह काम नहीं किया। किसी भी तरह से मैं इसे ठीक कर सकता हूं ताकि यह पहली बार सही तरीके से काम कर सके? मैं नहीं चाहता कि यह समस्या गणना पर हो, जहां गणित त्रुटि को नोटिस करना इतना आसान नहीं है।

+1

वॉरेन- मैंने आपके कोड को आपके द्वारा सुझाए गए अनुसार बदल दिया और आप बिल्कुल सही हैं! मैं भूल गया कि धुरी 3 के साथ अंतिम स्लॉट पहले रन में खाली था लेकिन जब आप कोड को दोबारा नहीं लेते थे।वैसे भी, जो आपने उत्तर के रूप में कहा था उसे पोस्ट करें और मैं इसे स्वीकार करूंगा। :) – ChristineB

+0

ठीक है, उत्तर जोड़ा गया। –

उत्तर

8

लाइन में

alltas[:,:,:,50] = np.mean(alltas,axis=3,dtype=np.float64) 

mean को तर्क alltas[:,:,:,:50] होना चाहिए:

alltas[:,:,:,50] = np.mean(alltas[:,:,:,:50], axis=3, dtype=np.float64) 

नहीं तो आप कलाकारों की टुकड़ी का मतलब है की गणना में उन अंतिम शून्य शामिल कर रहे हैं।

संबंधित मुद्दे