2015-06-14 2 views
0

Я новичок в Python и в настоящее время у меня есть текстовый файл, который выглядит следующим образом:NumPy loadtxt IndexError: Индекс списка вне диапазона

# Wed 13:10:08 11-Mar-2015 
begin aperture image1 1 1024. 139.7445 
image image1 
aperture 1 
beam 1 
center 1024. 139.7445 
low  -1023. -4. 
high 1024. 4. 
background 
     xmin -40.45428 
     xmax 43.75221 
     function chebyshev 
     order 3 
     sample -40.45428:-18.42313 20.09063:43.75221 
     naverage 1 
     niterate 0 
     low_reject 3. 
     high_reject 3. 
     grow 0. 
axis 2 
curve 6 
     2. 
     2. 
     4. 
     2044. 
     -0.1275881 
     -0.03320996 

Я хочу, чтобы извлечь «139.7445» из шестого ряда ('центр'). Это мой код:

pos_wasp = np.loadtxt(line, skiprows=5, usecols=(3,4), unpack=True)

Но когда я запускаю его, он выдает ошибку:

IndexError: list index out of range

Она должна быть простая задача решить, и я пытаюсь изменить столбец числа и типы данных много раз, но он все еще не работает.

+1

'np.genfromtxt (строка, skip_header = 5, skip_footer = 21, usecols = (1,2), unpack = True)' будет извлекать 'array ([1024., 139.7445])'. – nymk

+0

Я предполагаю, что ошибка индекса исходит из значения 'usecols'. Предоставление нам большего количества сообщений об ошибках (строки и т. Д.) Прояснит это. Но что более важно, это не тот файл, который 'loadtxt/genfromtxt' предназначен для обработки. – hpaulj

+0

Это работает с genfromtxt! Спасибо всем за вашу помощь :) – Tobita

ответ

0

Есть ли новая строка в конце текстового файла? Если да, избавитесь от него и посмотрите, работает ли это.

0

Я думаю, что ваш код не работает, потому что loadtxt хочет читать во всех строках после того, как ваше значение включено. Вы можете пропустить колонтитул с genfromtxt как предполагает @nymk, но только получить это одно значение, то почему бы не прочитать файл непосредственно:

with open('inpp.txt') as fi: 
    for line in fi: 
     fields = line.split() 
     if fields[0] == 'center': 
      val = float(fields[2]) 
      break 

print(val) 
1

Я думаю, что ваш код не удается, потому что loadtxt хочет читать во всех линиях после того, как одна ваша ценность включена. Для того, чтобы просто получить это одно значение, то почему бы не прочитать файл (inpp.txt, или то, что ваш называется) непосредственно:

with open('inpp.txt') as fi: 
    for line in fi: 
     fields = line.split() 
     if fields[0] == 'center': 
      val = float(fields[2]) 
      break 

print(val) 
1

Если вы попали на эту страницу после получения разочарование в связи с IndexError: list index out of range при использовании numpy.loadtxt, не отчаивайтесь.

Причина, по которой это не удается, состоит в том, что одна или несколько строк во входном текстовом файле не содержат столбцов, указанных в usecols=().

Чтобы исправить ошибку, убедитесь, что все строки в текстовом файле имеют столбец, который вы пытаетесь извлечь.

+0

Я знаю причину проблемы и не хочу смотреть на каждое значение, содержащее 400 тыс. Данных. Как заменить отсутствующие значения на 0 или некоторые значимые вещи и, следовательно, избежать этой ошибки. – Jyotirmay

+0

Вот оно. Если txt-ридер не сможет правильно проанализировать csv, строки не будут собраны, как ожидалось. Что приводит к значению usecols больше, чем количеству строк для некоторых столбцов. – Sia

Смежные вопросы