索引超出范围错误:Python

时间:2018-05-29 07:29:27

标签: python numpy

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

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]之间,则计算new_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 个答案:

答案 0 :(得分:0)

如果len(x) = 730比循环太短。您的循环会迭代1000次,i会在某个时刻大于730并且没有x[730]x[731]等值。您将获得超出绑定错误,因为您正在访问数组中不存在的值。

答案 1 :(得分:0)

您可以像这样更改for循环:

for i in range(0, len(x)):

答案 2 :(得分:0)

首先是一些基础知识

  1. Python是&#34;零索引&#34;,表示列表中的第一个元素被编入索引为0
  2. 范围为:[start, stop[,表示不包括最后一个元素。
  3. 看看如果你尝试会发生什么:

    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&#34; linspace&#34;采用以下输入:numpy.linspace(start, stop, N),产生一个封闭的范围[start, stop](注意它包括&#34;停止&#34;)和N元素。

    你想要元素的数量,或者len(xn)是730,而我猜测你希望&#34;停止&#34;值为max(x)

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

    提示   如果您不确定功能的签名,可以随时询问help,请尝试:help(numpy.linspace)

答案 3 :(得分:0)

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,即索引必须小于1或等于0

你无法比较这两个数组

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

是无与伦比的(你可以比较第一个元素。)

你可以使用这个:reshape

参考这个答案:What does -1 mean in numpy reshape?

row_x = x.reshape(-1)

会给你一个行向量。

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

col_x = row_x.reshape(-1,1)

我很感激编辑,因为我目前正在工作,因此赶紧写下答案。