#python #numpy
#python #numpy
Вопрос:
Существует файл, точно такой же, как этот, который называется: test.txt
:
John,19,7.5
Mary,22,9.8
Daniel,45,7.2
Hubert,92,10.0
Guy,28,9.5
Я собираюсь извлечь столбцы со 2 по 4:
grades = np.genfromtxt(r'testtest.txt',
delimiter=','
)
x = grades[:,1]
y = grades[:,2]
z = grades[:,3]
Интерпретатор говорит: IndexError: too many indices for array
однако моя нарезка, похоже, в порядке.
В чем проблема с этим?
Комментарии:
1. Вы посмотрели на
grades
и увидели, какие данные он содержит? Это может помочь вам определить, правильно ли он обрабатывается.2. @ksudoer: Полностью, по существу… Спасибо
Ответ №1:
import re
the_file = file("text.txt", 'r')
# x: the names , y: the integers , z: the floating numbers
x,y,z = [],[],[]
for line in the_file:
match = re.match('(w ),(d ),(d .d )', line)
if match:
x.append(match.group(1))
y.append(match.group(2))
z.append(match.group(3))
print x
print y
print z
Я полагаю, что первое число является целым числом, а второе десятичным..
Если это не так, то мы можем изменить регулярное выражение
Ответ №2:
Лучше указывать тип данных при чтении файла и использовать все преимущества структурированных массивов numpy. Например
import numpy as np
in_file = 'c:/data/csv.txt'
dt = [('Name', 'U10'), ('Age', 'i8'), ('Grade','f8')]
a = np.genfromtxt(in_file, dtype=dt, delimiter=",")
В результате получается файл с типом данных столбца (dtype). Поле может вызываться по имени и могут использоваться стандартные методы numpy.
>>> a
array([('John', 19, 7.5), ('Mary', 22, 9.8), ('Daniel', 45, 7.2),
('Hubert', 92, 10.0), ('Guy', 28, 9.5)],
dtype=[('Name', '<U10'), ('Age', '<i8'), ('Grade', '<f8')])
>>> a['Grade'].mean()
8.8000000000000007
>>> a['Age'].max()
92
Вы также можете преобразовать данные в повторный массив, если предпочитаете доступ через точечную нотацию, как показано ниже.
>>> b = a.view(np.recarray)
>>> b.Grade.mean()
8.8000000000000007
>>> b.Age.min()
19
Если вы много работаете с этим типом, то люди часто используют Pandas, который предоставляет более мягкий интерфейс и доступ к массивам numpy со смешанными типами данных.