2016-07-25 23 views
7

Vấn đềPython- np.mean() đưa ra phương tiện sai?

Vì vậy, tôi có 50 tệp dữ liệu netCDF4 chứa hàng chục dự đoán nhiệt độ hàng tháng trên lưới toàn cầu. Tôi đang sử dụng np.mean() để tạo ra một tập hợp trung bình của tất cả 50 tệp dữ liệu với nhau trong khi vẫn giữ độ dài thời gian & quy mô không gian, nhưng np.mean() mang lại cho tôi hai câu trả lời khác nhau. Lần đầu tiên tôi chạy khối mã của nó, nó mang lại cho tôi một con số, khi được tính trung bình trên vĩ độ & kinh độ & âm mưu chống lại chạy riêng lẻ, thấp hơn một chút so với ý nghĩa của quần thể. Nếu tôi chạy lại khối, nó mang lại cho tôi một ý nghĩa khác có vẻ chính xác.

tôi không thể sao chép tất cả các dòng ở đây vì nó dài, nhưng đây là những gì tôi làm cho mỗi lần chạy.

#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) 

Và tôi lặp lại 49 lần cho các tập dữ liệu khác. Mỗi tệp tas11, tas12, etc có hình dạng (1812, 64, 128) tương ứng với độ dài thời gian theo tháng, vĩ độ và kinh độ.

Để nhận được toàn bộ ý nghĩa, tôi làm như sau.

#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) 

Khi tôi kiểm tra một tọa độ & tháng, toàn bộ giá trị trung bình là tắt so với mức cần thiết. Đây là những gì một âm mưu của nhiệt độ trung bình trên toàn cầu từ 1950-2100 trông giống như với giá trị trung bình đầu tiên (với giá trị trung bình monhly vào giá trị hàng năm. Đen dòng là quần thể trung bình & dòng màu đang chạy cá nhân.

enter image description here

Rõ ràng rằng Dưới đây là những gì cốt truyện trông giống như khi tôi chạy alltas [:,:,:, 50] = np.mean (alltas, axis = 3, dtype = np.float64) lần thứ hai & giữ mọi thứ khác giống nhau

enter image description here

Tốt hơn nhiều.

Câu hỏi đặt ra

Tại sao np.mean() tính giá trị sai lần đầu tiên? Tôi đã thử xác định kiểu dữ liệu như một phao khi sử dụng np.mean() như trong câu hỏi này- Wrong numpy mean value? Nhưng nó không hoạt động. Bất kỳ cách nào tôi có thể sửa chữa nó để nó hoạt động chính xác lần đầu tiên? Tôi không muốn vấn đề này xảy ra trên một phép tính mà nó không phải là dễ dàng như vậy để nhận thấy một lỗi toán học.

+1

Warren- Tôi đã thay đổi mã của mình thành những gì bạn đề xuất và bạn hoàn toàn chính xác! Tôi quên khe cuối cùng dọc theo trục 3 đã trống trong lần chạy đầu tiên nhưng không phải khi bạn chạy lại mã.Dù sao, đăng những gì bạn nói như một câu trả lời và tôi sẽ chấp nhận nó. :) – ChristineB

+0

OK, câu trả lời đã được thêm. –

Trả lời

8

Trong dòng

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

lập luận để mean nên alltas[:,:,:,:50]:

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

Nếu không, bạn đã bao gồm những số không chính thức trong tính toán của các phương tiện quần.

Các vấn đề liên quan