我正在处理一些NetCDF文件。 为了生成可读的曲线图,我希望在长时间内平滑每日数据。 我为此做了一个小功能:
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
不幸的是,当我在变量时间序列中使用此函数时,如下代码所示:
^{pr2}$我收到以下错误消息:
TypeError Traceback (most recent call last)
<ipython-input-10-025f4573f745> in <module>()
12 ctessel_alb = albnc.variables[variable + '_ctessel'][:,0,0]
13
---> 14 obs_smooth = mov_avg(obs,7)
15
16
<ipython-input-3-c01b37a40c9a> in mov_avg(x, window, min_count, axis)
10 if ndim ==1 :
11 #print wd1,-wd1,wd-1
---> 12 yyF[wd1:-wd1]=np.ma.fix_invalid(xtmp[window-1:])
13
14 elif ndim == 2:
/home/david/anaconda3/lib/python3.6/site-packages/numpy/ma/core.py in __setitem__(self, indx, value)
3351 elif not self._hardmask:
3352 # Set the data, then the mask
-> 3353 _data[indx] = dval
3354 _mask[indx] = mval
3355 elif hasattr(indx, 'dtype') and (indx.dtype == MaskType):
TypeError: slice indices must be integers or None or have an __index__ method
是的,显然我的数据不是整数。。。有人知道如何克服这个错误吗?在
我想我明白了。
我还没有在Python2上测试过它,但是我想我知道为什么它在Python3中不起作用了。在{{{cd2}中的第一个参数是
当您调用函数时,您将其称为:
^{pr2}$其中
window=7
。在函数体中,wd1
被计算,但它的计算结果不是3,而是3.0—一个浮点值,而不是一个整数。因此,当它尝试执行以yyF[:,wd1:-wd1]
开头的行时,它失败了,因为wd1不是整数。在您可以尝试使用
int()
函数将其转换为float。在在使用Conda安装的python3.6.5的默认安装中,我测试了使用float和integer值访问示例列表。在
在您的代码的特定情况下:
编辑:在Python2中,最后一个操作的结果将是一个整数,而不是一个浮点。也许这就是为什么它使用python2而不是python3?在
免责声明:我不熟悉编程,如果这不是原因,对不起!我试着通过几个问题来了解更多,这样我就可以理解了。在
相关问题 更多 >
编程相关推荐