Лучшая структура данных: массивы словарей, массивы объектов? - PullRequest
2 голосов
/ 20 февраля 2012

Я конвертирую в Python и Numpy из IDL (вроде как Matlab). Это своего рода открытый вопрос об обработке данных. Может быть, кто-то может помочь.

Обычная ситуация с моими данными состоит в том, что у меня есть фиксированный класс данных, возможно, из электронной таблицы, базы данных и т. Д. Я пытаюсь выяснить, какие структуры данных лучше всего использовать в python и numpy.

Я знаю о модуле csv и могу использовать csv.DictReader () для чтения электронных таблиц. Это читает строку за строкой и создает словарь с правильными именами из заголовка таблицы (первая строка).

f=open(file,'rU')
dat = csv.DictReader(f)
i=0
data=[] # makes an empty list
i=0
for row in dat:
    data.append(row)
    if i == 0 :
        keys=row.keys()
        print "keys"
        print keys
        print
    i=i+1

f.close()

Прежде всего, это довольно много кода для чтения CSV-файла в список словарей и ввода ключей. Есть ли более быстрый / лучший способ?

Но теперь мне интересно, действительно ли массив словарей - это то, что я хочу. Должен ли я сделать класс объектов и сделать это массив объектов? Или что-то еще?

Если бы у меня был мой массив словарей "данные", я бы получил такой "столбец", как age = array ([дата ["возраст"] для данных в данных))

Это правильный способ сделать это? Нет ли способа, подобного age = data-> age, сделать это быстрее?

Буду признателен за некоторые рекомендации. Спасибо.

Ответы [ 4 ]

5 голосов
/ 20 февраля 2012

Если вы много работаете с данными типа электронных таблиц, я настоятельно рекомендую использовать pandas , пакет Python, разработанный для такого рода вещей. Вы просто делаете:

pandas.read_csv(file)

Это дает вам DataFrame, который выполняет все виды необычной индексации, а также хорош и быстр.

2 голосов
/ 21 февраля 2012

Видя, как вы явно упоминаете использование numpy, рассмотрите что-то вроде следующего:

import numpy as np
data = np.genfromtxt('data.txt', delimiter=',', names=True)
print data['item1']

Или

import numpy as np
item1, item2, item3 = np.loadtxt('data.txt', delimiter=',', skiprows=1).T

Где формат data.txt является чем-то вроде этого (т.е. через запятую).

item1, item2, item3
1.0, 2.0, 3.0
4.0, 5.0, 6.0
7.0, 8.0, 9.0

В первом примере используются структурированные массивы, а во втором - просто распаковка столбцов (таким образом, транспонирование (.T)) в три переменные.

0 голосов
/ 20 февраля 2012

Все в порядке, хотя ваш код легко сделать более лаконичным:

data = list(csv.DictReader(open(file, 'rU')))
print "keys", data[0].keys()
0 голосов
/ 20 февраля 2012

Я всегда хожу с массивами объектов

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