завантажте csv у 2D-матрицю з numpy для побудови графіків


79

Враховуючи цей файл 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.

Відповіді:


153

Чистий нумпі

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масив, який може бути швидшим.


Я хотів би додати, що прапор skiprows = 1 пропускає перший рядок і не є стандартним прапором активації, якщо ви хочете зберегти всі дані. Працювали чудово!
Артуро 02

loadtxt не завантажує також імена стовпців, які трапляються з іменами = True на genfromtxt
mhstnsc

Чи можу я запитати - чи є openмісцевим для цього одного рядка? Як і в, чи закривається файл у кінці рядка?
Даніель Сутар

Так, це закриває файл. Дивіться також: stackoverflow.com/questions/8011797 / ...
Kaveh_kh

Я б запропонував використовувати метод seocnd, оскільки loadtxtвін дуже повільний. Як варіант pandas- цілком чудовий для цієї мети
вогненна куля. 1

6

Я думаю, що використання 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])

Цікаво, що це не змінює результату в моєму випадку. Я використовую Python 2.5 і numpy 1.4.1, тому, можливо, в цьому проблема
dgorissen

Я використовую Python 2.6 та NumPy 1.3.0! Мені більше подобається старша поведінка.
mtrw

4

Ви можете прочитати файл 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])

Примітка: ця відповідь раніше використовувала np.recfromcsv для зчитування даних у масиві записів NumPy . Хоча в цьому методі не було нічого поганого, структуровані масиви, як правило, кращі за масиви записів для швидкості та сумісності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.