"类型错误:切片索引必须是整数、无、或带有浮点数时间序列的 __index__ 方法"

2024-09-28 16:59:42 发布

您现在位置:Python中文网/ 问答频道 /正文

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

是的,显然我的数据不是整数。。。有人知道如何克服这个错误吗?在


Tags: countnpminwindowfixelifaxisma
1条回答
网友
1楼 · 发布于 2024-09-28 16:59:42

我想我明白了。 我还没有在Python2上测试过它,但是我想我知道为什么它在Python3中不起作用了。在

{{{cd2}中的第一个参数是

wd1=(window-1)/2

当您调用函数时,您将其称为:

^{pr2}$

其中window=7。在函数体中,wd1被计算,但它的计算结果不是3,而是3.0—一个浮点值,而不是一个整数。因此,当它尝试执行以yyF[:,wd1:-wd1]开头的行时,它失败了,因为wd1不是整数。在

您可以尝试使用int()函数将其转换为float。在

在使用Conda安装的python3.6.5的默认安装中,我测试了使用float和integer值访问示例列表。在

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

编辑:在Python2中,最后一个操作的结果将是一个整数,而不是一个浮点。也许这就是为什么它使用python2而不是python3?在

免责声明:我不熟悉编程,如果这不是原因,对不起!我试着通过几个问题来了解更多,这样我就可以理解了。在

相关问题 更多 >