Вопрос-Ответ

How do I read CSV data into a record array in NumPy?

Как мне считывать CSV-данные в массив записей в NumPy?

Есть ли прямой способ импортировать содержимое CSV-файла в массив записей, точно так же, как R read.table(), read.delim() и read.csv() импортируют данные в R dataframes?

Или я должен использовать csv.reader(), а затем применить numpy.core.records.fromrecords()?

Переведено автоматически
Ответ 1

Используйте numpy.genfromtxt(), установив delimiter значение kwarg в запятую:

from numpy import genfromtxt
my_data = genfromtxt('my_file.csv', delimiter=',')
Ответ 2

Использование pandas.read_csv:

import pandas as pd
df = pd.read_csv('myfile.csv', sep=',', header=None)
print(df.values)
array([[ 1. ,  2. ,  3. ],
[ 4. , 5.5, 6. ]])

Это дает pandas, DataFrame который предоставляет множество полезных функций манипулирования данными, которые недоступны напрямую с массивами записей numpy.


DataFrame это двумерная помеченная структура данных со столбцами потенциально разных типов. Вы можете представить ее как электронную таблицу или таблицу SQL...



Я бы также рекомендовал numpy.genfromtxt. Однако, поскольку в вопросе запрашивается массив записей, в отличие от обычного массива, dtype=None параметр необходимо добавить к genfromtxt вызову:

import numpy as np
np.genfromtxt('myfile.csv', delimiter=',')

Для следующего 'myfile.csv':

1.0, 2, 3
4, 5.5, 6

приведенный выше код выдает массив:

array([[ 1. ,  2. ,  3. ],
[ 4. , 5.5, 6. ]])

и

np.genfromtxt('myfile.csv', delimiter=',', dtype=None)

выдает массив записей:

array([(1.0, 2.0, 3), (4.0, 5.5, 6)], 
dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<i4')])

Преимущество этого заключается в том, что файлы с несколькими типами данных (включая строки) могут быть легко импортированы.

Ответ 3

Я пробовал :

from numpy import genfromtxt
genfromtxt(fname = dest_file, dtype = (<whatever options>))

против :

import csv
import numpy as np
with open(dest_file,'r') as dest_f:
data_iter = csv.reader(dest_f,
delimiter = delimiter,
quotechar = '"')
data = [data for data in data_iter]
data_array = np.asarray(data, dtype = <whatever options>)

обработал 4,6 миллиона строк с примерно 70 столбцами и обнаружил, что путь NumPy занял 2 минуты 16 секунд, а метод понимания csv-списка занял 13 секунд.

Я бы порекомендовал метод понимания csv-списка, поскольку он, скорее всего, полагается на предварительно скомпилированные библиотеки, а не на интерпретатор в такой степени, как NumPy. Я подозреваю, что метод pandas будет иметь аналогичные накладные расходы на интерпретатор.

Ответ 4

Вы также можете попробовать recfromcsv() который может угадывать типы данных и возвращать правильно отформатированный массив записей.

python numpy scipy