我正在处理一些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
不幸的是,当我在可变时间序列之一中使用此函数时,如以下代码所示:
for station in stations:
for variable in variables:
os.chdir(inbasedir + variable + "_albedomodis2/")
albmerge = "%s/%s_%s_merged.nc"%(inbasedir + variable + "_albedomodis2/",station,variable)
albnc = Dataset(albmerge, 'r+')
obs = albnc.variables[variable + '_obs'][:,0,0]
obs_smooth = mov_avg(obs,7)
我收到以下错误消息:
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
是的,显然我的数据不是整数...有人知道如何克服此错误吗?
答案 0 :(得分:1)
我想我明白了。 我还没有针对Python 2进行过测试,但是我想我知道为什么它在Python 3中不起作用。
在定义功能mov_avg
的第一个代码块中,前两个参数是x
和window
。在函数中,您可以看到以下行:
wd1=(window-1)/2
调用该函数时,其调用方式为:
obs_smooth = mov_avg(obs,7)
其中window=7
。在函数主体wd1
中进行了计算,但其取值不为3,其取值为3.0-浮点值,而不是整数。因此,当它尝试执行以yyF[:,wd1:-wd1]
开头的行时,它会失败,因为wd1不是整数。
您可以尝试使用int()
函数将其转换为浮点数。
我测试了在使用Conda安装的Python 3.6.5的默认安装中使用浮点数和整数值访问示例列表的情况。
Python 3.6.5 |Anaconda, Inc.| (default, Mar 29 2018, 13:32:41) [MSC v.1900 64 bit
(AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [1,2,3,4,5]
>>> a[0], a[4]
(1, 5)
>>> a[0.0,4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list indices must be integers or slices, not tuple
在您的代码的特定情况下:
>>> window = 7
>>> wd1 = (window-1)/2
>>> wd1
3.0
>>> a[wd1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list indices must be integers or slices, not float
编辑:在Python 2中,最后一个操作的结果将是一个整数,而不是浮点数。也许这就是为什么它可以在Python 2上运行而不在Python 3上运行的原因?
免责声明:我是编程新手,所以如果不是这个原因,对不起!我试图通过尝试一些我能理解的问题来学习更多的知识。