загрузить 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.


person dgorissen    schedule 30.11.2010    source источник


Ответы (3)


Чистый нумный

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, который может быть быстрее.

person Kaveh_kh    schedule 30.11.2010
comment
Я бы добавил, что флаг skiprows = 1 пропускает первую строку и не является стандартным флагом активации, если вы хотите сохранить все данные. Сработало отлично! - person Arturo; 03.01.2017
comment
loadtxt не загружает также имена столбцов, которые встречаются с names = True в genfromtxt - person mhstnsc; 26.10.2017
comment
Могу я спросить - open локально для этой единственной строки? Например, закрывается ли файл в конце строки? - person Daniel Soutar; 22.03.2018
comment
Да, закрывает файл. См. Также: stackoverflow.com/questions/8011797/ - person Kaveh_kh; 22.03.2018
comment
Я бы посоветовал использовать метод seocnd, поскольку loadtxt ужасно медленный. В качестве альтернативы pandas отлично подходит для этой цели - person fireball.1; 13.02.2019
comment
@ fireball.1 тесты скорости для подобных заявлений были бы полезны для потомков - person Akaisteph7; 30.05.2020

Я думаю, что использование 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])
person mtrw    schedule 30.11.2010
comment
Что интересно, в моем случае это не меняет результата. Я использую Python 2.5 и numpy 1.4.1, так что, возможно, это проблема - person dgorissen; 30.11.2010
comment
Я использую Python 2.6 и NumPy 1.3.0! Мне больше нравится старое поведение. - person mtrw; 30.11.2010

Вы можете прочитать CSV-файл с заголовками в структурированном массиве NumPy с помощью np.genfromtxt. Например:

import numpy as np

csv_fname = 'file.csv'
with open(csv_fname, 'w') as fp:
    fp.write("""\
"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
""")

# Read the CSV file into a Numpy record array
r = np.genfromtxt(csv_fname, delimiter=',', names=True, case_sensitive=True)
print(repr(r))

что выглядит так:

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])

Примечание. В этом ответе ранее для считайте данные в массив записей NumPy. Хотя в этом методе не было ничего плохого, структурированные массивы, как правило, лучше, чем массивы записей, по скорости и совместимости.

person Mike T    schedule 22.02.2016