TypeError:切片索引必须为整数或无,或在浮点数时间序列上具有__index__方法

时间:2018-08-30 12:59:35

标签: python int netcdf

我正在处理一些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

是的,显然我的数据不是整数...有人知道如何克服此错误吗?

1 个答案:

答案 0 :(得分:1)

我想我明白了。 我还没有针对Python 2进行过测试,但是我想我知道为什么它在Python 3中不起作用。

在定义功能mov_avg的第一个代码块中,前两个参数是xwindow。在函数中,您可以看到以下行:

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上运行的原因?

免责声明:我是编程新手,所以如果不是这个原因,对不起!我试图通过尝试一些我能理解的问题来学习更多的知识。