Загрузить csv в 2D-матрицу с numpy для построения графика
Учитывая этот файл CSV:
"A","B","C","D","E","F","timestamp"
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291111964948E12
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291113113366E12
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291120650486E12
Я просто хочу загрузить его как матрицу /ndarray с 3 строками и 7 столбцами. Однако по какой-то причине все, что я могу получить из numpy, это ndarray с 3 строками (по одной в строке) и без столбцов.
r = np.genfromtxt(fname,delimiter=',',dtype=None, names=True)
print r
print r.shape
[ (611.88243, 9089.5601000000006, 5133.0, 864.07514000000003, 1715.3747599999999, 765.22776999999996, 1291111964948.0)
(611.88243, 9089.5601000000006, 5133.0, 864.07514000000003, 1715.3747599999999, 765.22776999999996, 1291113113366.0)
(611.88243, 9089.5601000000006, 5133.0, 864.07514000000003, 1715.3747599999999, 765.22776999999996, 1291120650486.0)]
(3,)
Я могу вручную перебрать и взломать его в форму, которую я хочу, но это кажется глупым. Я просто хочу загрузить его как подходящую матрицу, чтобы я мог нарезать ее по разным измерениям и нарисовать ее так же, как в Matlab.
Ответы
Ответ 1
Чистая numpy
numpy.loadtxt(open("test.csv", "rb"), delimiter=",", skiprows=1)
Ознакомьтесь с документацией loadtxt.
Вы также можете использовать модуль csv python:
import csv
import numpy
reader = csv.reader(open("test.csv", "rb"), delimiter=",")
x = list(reader)
result = numpy.array(x).astype("float")
Вам придется преобразовать его в ваш любимый цифровой тип. Я думаю, вы можете написать все в одной строке:
result = numpy.array(list(csv.reader(open("test.csv", "rb"), delimiter=","))).astype("float")
Добавлена подсказка:
Вы также можете использовать pandas.io.parsers.read_csv
и получить связанный массив numpy
, который может быть быстрее.
Ответ 2
Я думаю, что использование dtype
, где есть строка с именами, запутывает эту процедуру. Попробуйте
>>> r = np.genfromtxt(fname, delimiter=',', names=True)
>>> r
array([[ 6.11882430e+02, 9.08956010e+03, 5.13300000e+03,
8.64075140e+02, 1.71537476e+03, 7.65227770e+02,
1.29111196e+12],
[ 6.11882430e+02, 9.08956010e+03, 5.13300000e+03,
8.64075140e+02, 1.71537476e+03, 7.65227770e+02,
1.29111311e+12],
[ 6.11882430e+02, 9.08956010e+03, 5.13300000e+03,
8.64075140e+02, 1.71537476e+03, 7.65227770e+02,
1.29112065e+12]])
>>> r[:,0] # Slice 0'th column
array([ 611.88243, 611.88243, 611.88243])
Ответ 3
Вы можете прочитать CSV файл с заголовками в массив записей NumPy с np.recfromcsv. Например:
import numpy as np
import StringIO
csv_text = """\
"A","B","C","D","E","F","timestamp"
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291111964948E12
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291113113366E12
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291120650486E12
"""
# Make a file-like object
csv_file = StringIO.StringIO(csv_text)
csv_file.seek(0)
# Read the CSV file into a Numpy record array
r = np.recfromcsv(csv_file, case_sensitive=True)
print(repr(r))
который выглядит следующим образом:
rec.array([ ( 611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777, 1.29111196e+12),
( 611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777, 1.29111311e+12),
( 611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777, 1.29112065e+12)],
dtype=[('A', '<f8'), ('B', '<f8'), ('C', '<f8'), ('D', '<f8'), ('E', '<f8'), ('F', '<f8'), ('timestamp', '<f8')])
Вы можете получить доступ к названному столбцу, подобному этому r['E']
:
array([ 1715.37476, 1715.37476, 1715.37476])