чтение и нарезка 2d-списка в python

#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 со смешанными типами данных.