Эффективно ли использовать списки для чтения данных, прежде чем присваивать их массиву numpy? - PullRequest
2 голосов
/ 17 февраля 2012

У меня есть большой файл данных CSV - ~ 1 444 000 строк данных - который я читаю и преобразую в массив.Я прочитал три из 22 столбцов.Вот что я сейчас делаю:

import numpy as np
import csv

fid = open('data.csv', 'r')
csvfile = csv.reader(fid, dialect='excel', delimiter=',')
csvfile.next() # to skip header

t = []
u = []
w = []
for line in csvfile:
  t += [line[1]] # time
  u += [line[-4]] # velocity x
  w += [line[-2]] # velocity z
t = np.array(t, dtype='float')  
u = np.array(u, dtype='float')
w = np.array(w, dtype='float')

Итак, мой вопрос: насколько это эффективно?Первоначально я собирался добавить новые данные в существующий массив в цикле, пока не прочитал, что весь массив должен каждый раз перемещаться в памяти.

Ответы [ 2 ]

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

Я бы предложил numpy.loadtxt () .Я не использовал его для csv, но вы можете установить разделитель на ',' и получить только те столбцы, которые вам нужны, в виде пустого ndarray.

Я подозреваю, что сработает следующее:

# To load only columns 1 (time), 19 (velocity x), and 21 (velocity z).
numpy.loadtxt('data.csv', delimiter=',', usecols=(1,19,21))
4 голосов
/ 17 февраля 2012

Существует простой способ выяснить, что является более эффективным - написать обе реализации (простые списки и numpy) и профилировать их: http://docs.python.org/library/profile.html.

Если вы работаете в * nix ОС, вы также можете выполнить более простое измерение: запустите каждую версию скрипта как $ time python script.py.

Как примечание, вместо этого

t += [line[1]] # time

используйте это

t.append(line[1]) # time

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