Ошибка индекса вне границ: Python - PullRequest
0 голосов
/ 29 мая 2018

У меня есть набор данных, который не является гладким.Поэтому я пытаюсь интерполировать его с созданной сеткой.

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 голосов
/ 29 мая 2018

официальная документация numpy linspace

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

иВы не можете сравнить эти два массива

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

несопоставимы (хотя вы можете сравнить первый элемент.)

вы можете использовать это: изменить форму

сослаться на этот ответ: Что означает -1 в numpy изменить форму?

row_x = x.reshape(-1)

дастВы - вектор строки.

, и вы можете преобразовать его в формат столбца следующим образом:

col_x = row_x.reshape(-1,1)

Я был бы признателен за изменения, так как я в данный момент на работе и, следовательно,написал ответ вспешка.

0 голосов
/ 29 мая 2018

Вы можете изменить цикл for следующим образом:

for i in range(0, len(x)):
0 голосов
/ 29 мая 2018

Сначала некоторые основы

  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, и я предполагаю , вы хотите, чтобы значение "stop" было max(x):

xn = numpy.linspace(0, max(x), len(x))

for i in range(len(x)):
  ...

Совет: Если вы не уверены в сигнатуре функции, которую вы всегда можете запросить help, попробуйте: help(numpy.linspace)

0 голосов
/ 29 мая 2018

Если len(x) = 730, то это слишком коротко для цикла.Ваш цикл повторяется 1000 раза, i будет в какой-то момент больше, чем 730, и нет таких значений, как x[730], x[731] и т. Д. Вы получите ошибку выхода за границы, поскольку вы обращаетесь к несуществующимзначения в массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...