我有一些NetCDF文件,需要从中绘制一些变量。 我使用以下小代码来绘制所需的数据:
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
%matplotlib inline
import xarray as xr
os.chdir
fname = "/home/data.nc"
ds = xr.open_dataset(fname)
ds['Evap_obs'].plot()
plt.show()
哪项工作正常,并产生下图:
我现在的问题是,该图不真正可读。因此,我希望事先对数据进行平滑处理。为此,我有这个小功能:
def mov_avg(x,window,min_count=None,axis=-1):
import bottleneck as bn
yy=np.ma.filled(np.ma.fix_invalid(x),np.nan)
yyF=np.ma.masked_all(yy.shape)
xtmp=bn.move_mean(yy,window,min_count=min_count,axis=axis)
wd1=(window-1)/2
ndim = len(yy.shape)
#print xtmp.shape,ndim,axis,window,wd1
if ndim ==1 :
#print wd1,-wd1,wd-1
yyF[wd1:-wd1]=np.ma.fix_invalid(xtmp[window-1:])
elif ndim == 2:
if axis==-1 or axis==1:
yyF[:,wd1:-wd1]=np.ma.fix_invalid(xtmp[:,window-1:])
elif axis==0:
yyF[wd1:-wd1,:]=np.ma.fix_invalid(xtmp[window-1:,:])
return yyF
然后,当我希望对我的数据运行此函数以使其平滑化时(使用7个时间步长的窗口进行平滑):
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
%matplotlib inline
import xarray as xr
os.chdir
fname = "/home/data.nc"
ds = xr.open_dataset(fname)
obs = ds['Evap_obs']
obs = mov_avg(obs,7)
obs.plot()
它不起作用,并且出现以下ValueError:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-18-6a8a2dd438c6> in <module>()
7 #dsloc = ds.sel(lon=230.5,lat=55.0,method='nearest')
8 obs = ds['Evap_obs']
----> 9 obs = mov_avg(obs,7)
10 obs.plot()
11 #ds['Evap_obs'].plot()
<ipython-input-11-c01b37a40c9a> in mov_avg(x, window, min_count, axis)
4 yy=np.ma.filled(np.ma.fix_invalid(x),np.nan)
5 yyF=np.ma.masked_all(yy.shape)
----> 6 xtmp=bn.move_mean(yy,window,min_count=min_count,axis=axis)
7 wd1=(window-1)/2
8 ndim = len(yy.shape)
ValueError: Moving window (=7) must between 1 and 1, inclusive
请问有人知道如何平滑我的数据吗?
答案 0 :(得分:3)
Xarray包含rolling方法用于这些类型的操作。
ds['Evap_obs'].rolling(time=7).mean().plot()
xarray文档包含使用此方法的少数示例:http://xarray.pydata.org/en/stable/computation.html#rolling-window-operations
答案 1 :(得分:1)
以下是this answer的一个简单的移动平均实现,仅使用numpy:
for (const key in this.Object_name) {
if (this.Object_name[key].name == 'value_1' ){
console.log(this.Object_name[key].prop);
}
}