Numpy IndexError читает csv с genfromtxt и строкой первого столбца

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

import os
import numpy as np

input_file = os.path.normpath('C:/Users/sturaroa/Documents/PycharmProjects/my_file.tsv')

# read values from file, by column
my_data = np.genfromtxt(input_file, delimiter='\t', skip_header=0)
print('my_data\n' + str(my_data))

groups = my_data[:, 0]  # 1st column
X = my_data[:, 1]  # 2nd column
Y = my_data[:, 2]  # 3rd column
errors = my_data[:, 3]  # 4th column (errors)
print('\ngroups ' + str(groups) + '\nX ' + str(X) + '\nY ' + str(Y) + '\nerrors ' + str(errors))

Это содержимое файла (разделено табуляцией)

2.4    2    4.0    0.0
2.4    4    8.210526    0.7254761
2.9    4    8.4    0.8081221
2.9    6    12.52    1.0544369

Программа печатает это

my_data
[[  2.4         2.          4.          0.       ]
 [  2.4         4.          8.210526    0.7254761]
 [  2.9         4.          8.4         0.8081221]
 [  2.9         6.         12.52        1.0544369]]

groups [ 2.4  2.4  2.9  2.9]
X [ 2.  4.  4.  6.]
Y [  4.         8.210526   8.4       12.52    ]
errors [ 0.         0.7254761  0.8081221  1.0544369]

Я видел этот вопрос, предлагающий использовать dtype=None. Однако, если я это сделаю, я получаю эту ошибку

Traceback (most recent call last):
  File "C:/Users/sturaroa/Documents/PycharmProjects/2d_plot_test.py", line 11, in <module>
    groups = my_data[:, 0]  # 1st column
IndexError: too many indices for array

Мне нужно настроить свой код для работы с таким вводом

something    2    4.0    0.0
something    4    8.210526    0.7254761
some_other_thing    8.4    0.8081221
some_other_thing    12.52    1.0544369

Этот первый столбец представляет собой строку переменной длины, остальные столбцы — числа (целые или с плавающей запятой).

Я использую numpy 1.9.2 на Python 2.7.


person Agostino    schedule 08.05.2015    source источник


Ответы (2)


Когда вы читаете с помощью dtype=None и есть строковые столбцы, genfromtxt дает вам структурированный массив. Напечатайте my_data и посмотрите на его форму и тип (и добавьте их к своему вопросу).

Доступ к столбцам такого массива осуществляется по имени, а не по индексу. Поскольку вы не используете заголовок и не даете имена, доступ к первому столбцу будет осуществляться с помощью my_data['f0'].

Возможно, вам придется просмотреть документы numpy по структурированным массивам.

person hpaulj    schedule 08.05.2015

Я не смог добраться до индекса вашего вопроса

Ввод, для которого вы хотите настроить свой код, кажется, имеет нечетное количество столбцов. Вы можете либо настроить количество столбцов, либо использовать что-то вроде этого вместо genfromtext и вместо этого использовать np.asmatrix, чтобы сохранить матричную структуру независимо от количества столбцов во входных данных. Это дает мне -

In [1827]: paste
my_data = np.asmatrix([line.split() for line in open('input2.txt')])
print('my_data\n' + str(my_data))

groups = my_data[:, 0]  # 1st column
X = my_data[:, 1]  # 2nd column
Y = my_data[:, 2]  # 3rd column
errors = my_data[:, 3]  # 4th column (errors)
print('\ngroups ' + str(groups) + '\nX ' + str(X) + '\nY ' + str(Y) + '\nerrors ' + str(errors))

## -- End pasted text --
my_data
[[['something', '2', '4.0', '0.0']
  ['something', '4', '8.210526', '0.7254761']
  ['some_other_thing', '8.4', '0.8081221']
  ['some_other_thing', '12.52', '1.0544369']]]

groups [[['something', '2', '4.0', '0.0']]]
X [[['something', '4', '8.210526', '0.7254761']]]
Y [[['some_other_thing', '8.4', '0.8081221']]]
errors [[['some_other_thing', '12.52', '1.0544369']]]
person fixxxer    schedule 08.05.2015