Как загрузить CSV-файл, содержащий строки и числа, используя genfromtxt? - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь загрузить файл csv в массив NumPy для целей машинного обучения.До сих пор я всегда работал с данными типа int или float, но мой текущий csv содержит строку, float и int, поэтому у меня возникли некоторые проблемы с аргументом dtype.Мои наборы данных имеют 41188 выборок и 8 функций, например:

47;"university.degree";"yes";176;1;93.994;-36.4;4.857;"no"

Я знаю, что если я укажу dtype = None, типы будут определяться содержимым каждого столбца:

data = np.genfromtxt(filename, dtype=None, delimiter=";", skip_header=1)

но это, видимо, не работает.Прежде всего, результатом genfromtxt является nundy ndarray со следующей формой:

In [2]: data.shape
Out[2]: (41188,)

, а я ожидаю (41188,8)

Вместо этого, если я использую dtype по умолчанию:

data2 = np.genfromtxt(filename, delimiter=";", skip_header=1)

Я получаю следующую форму данных:

In [4]: data2.shape
Out[4]: (41188,8)

Во-вторых, с dtype = None я получаю следующее предупреждение об устаревании:

VisibleDeprecationWarning: Reading unicode strings without specifying the encoding argument is deprecated. Set the encoding, use None for the system default.

Что я могуисправить с помощью (это правильно?):

encoding='ASCII'

У меня есть 2 вопроса:

  1. Как установить правильный тип каждого столбца?
  2. Почему я должен установить кодировку?

1 Ответ

0 голосов
/ 29 декабря 2018

С 2 копиями вашей строки выборки:

In [140]: data = np.genfromtxt(txt, dtype=None, delimiter=';', encoding=None)
In [141]: data
Out[141]: 
array([(47, '"university.degree"', '"yes"', 176, 1, 93.994, -36.4, 4.857, '"no"'),
       (47, '"university.degree"', '"yes"', 176, 1, 93.994, -36.4, 4.857, '"no"')],
      dtype=[('f0', '<i8'), ('f1', '<U19'), ('f2', '<U5'), ('f3', '<i8'), ('f4', '<i8'), ('f5', '<f8'), ('f6', '<f8'), ('f7', '<f8'), ('f8', '<U4')])
In [142]: data.shape
Out[142]: (2,)
In [143]: data.dtype
Out[143]: dtype([('f0', '<i8'), ('f1', '<U19'), ('f2', '<U5'), ('f3', '<i8'), ('f4', '<i8'), ('f5', '<f8'), ('f6', '<f8'), ('f7', '<f8'), ('f8', '<U4')])

Это обычный структурированный массив - data - это 1d массив с 8 полями.Поля имеют dtype, который соответствует типу float, integer или string, который является общим для каждого столбца.

Доступ к полям осуществляется по имени, а не по номеру столбца:

In [144]: data['f0']
Out[144]: array([47, 47])
In [145]: data['f1']
Out[145]: array(['"university.degree"', '"university.degree"'], dtype='<U19')

Обратите внимание, что я включилencoding=None.Я не совсем уверен, когда это необходимо, но это легко включить.

...