【问题标题】:Python - How to smooth xarray plot?Python - 如何平滑 xarray 图?
【发布时间】:2018-08-30 00:50:05
【问题描述】:

我有一些 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

请问有人知道如何平滑我的数据吗?

【问题讨论】:

    标签: python smoothing python-xarray


    【解决方案1】:

    Xarray 包含用于此类操作的rolling 方法。

    ds['Evap_obs'].rolling(time=7).mean().plot()
    

    xarray 文档包含一些使用此方法的示例:http://xarray.pydata.org/en/stable/computation.html#rolling-window-operations

    【讨论】:

      【解决方案2】:

      以下是来自this answer 的简单移动平均线实现,仅使用 numpy:

      import numpy as np
      def moving_average(a, n=3) :
          ret = np.cumsum(a, dtype=float)
          ret[n:] = ret[n:] - ret[:-n]
          return ret[n - 1:] / n
      

      【讨论】:

        猜你喜欢
        • 2021-03-07
        • 2021-03-05
        • 2017-11-28
        • 2013-01-23
        • 1970-01-01
        • 2010-12-20
        • 1970-01-01
        • 2020-06-07
        • 1970-01-01
        相关资源
        最近更新 更多