代码之家  ›  专栏  ›  技术社区  ›  newstudent

索引越界错误:python

  •  1
  • newstudent  · 技术社区  · 8 年前

    我有一组数据不平滑。因此,我尝试用生成的网格对其进行插值。

    import numpy as np
    data=np.loadtxt('test.txt')
    x=data[:,0] #len(x) = 730
    y=data[:,1]
    
    Nx= len(x)
    Ny=len(y)
    del_x= 0.5
    xn = np.linspace(0,Nx,2000)
    yn = np.linspace(0,Ny,2000)
    
    #loop 
    for i in range(0,Nx-1):
     if x[i] > xn[i] and x[i] < xn[i+1]:
      new_x= (i + (xn[i] - x[i])/(xn[i]-xn[i+1]))*del_x
    print new_x
    

    我想执行一个循环来完成这个操作,即:如果我的原始数据x[i]在两个网格点xn[i],xn[i+1]之间,那么计算新的x。

    但我得到以下错误

    Traceback (most recent call last):
     File "new.py", line 27, in <module>
      if x[i] > xn[i] and x[i] < xn[i+1]:
    IndexError: index out of bound
    

    有人能帮我吗?

    4 回复  |  直到 8 年前
        1
  •  0
  •   DevX    8 年前

    numpy linspace official documentation

    xn = np.linspace(0,Nx,2000)

    在这里 0 是起始值, Nx 是最终值,并且 2000 是要生成的值的数目。

    linspace返回的对象如下:

    [0, 0.5, 1, ... , ] #2000 elements 即包含2000个元素的行

    x=data[:,0] x类似于:

    [[1],[2],[3],[4], .... ,[]] #column vector with number of elements in text data

    现在x的行大小不能大于 1 IE索引必须小于 或等于

    你不能比较这两个数组

    [ ... ] [[], [], [], [], ... ]

    是不可比的(但是您可以比较第一个元素。)

    你可以用这个: reshape

    请参阅此答案: What does -1 mean in numpy reshape?

    row_x = x.reshape(-1)

    会给你一个行向量。

    您可以通过以下方式转换为列格式:

    col_x = row_x.reshape(-1,1)

    我很感谢编辑,因为我现在在工作,所以写的答案很快。

        2
  •  0
  •   Hejun    8 年前

    您可以这样更改for循环:

    for i in range(0, len(x)):
    
        3
  •  0
  •   Sigve Karolius    8 年前

    首先是一些基础知识

    1. python是“零索引”的,这意味着列表中的第一个元素被索引为 0 .
    2. 范围如下: [start, stop[ ,表示不包含最后一个元素。

    如果你尝试一下,看看会发生什么:

    a = [1, 2, 3]
    print("a has %d elements:" %(len(a)))
    for i in range(len(a)):
      print("a[%d] = %d" %(i, a[i]))
    

    输出为:

    a has 3 elements:
    a[0] = 1
    a[1] = 2
    a[2] = 3
    

    如果你试图进入 a[3] 您将看到:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: list index out of range
    

    现在谈谈你的问题

    numpy“linspace”接受以下输入: numpy.linspace(start, stop, N) ,导致一个闭合范围 [start, stop] (注意它包括“停止”)。 N 元素。

    您需要元素的数量,或者 len(xn) 730岁,我是 猜测 您希望“停止”值为 max(x) :

    xn = numpy.linspace(0, max(x), len(x))
    
    for i in range(len(x)):
      ...
    

    提示: 如果您对函数的签名不确定,可以随时要求 help 试一下: help(numpy.linspace)

        4
  •  0
  •   Anh Pham    8 年前

    如果 len(x) = 730 比它对循环来说太短。循环迭代 1000 时代, i 在某一点上会比 730 没有价值观 x[730] , x[731] 等。您将得到一个超出界限的错误,因为您正在访问数组中不存在的值。