2016-04-04 4 views
2

У меня проблема, и я не знаю, как с ней справиться.Массив Numpy при импорте из CSV

У меня есть CSV файл, как это:

0.3,36.22683698,-115.0466482,1836.255238,0,0,0.2105903662,0.6848089322,41.15086807,2016/3/26,4:35:51 
0.6,36.22683698,-115.0466482,1836.255238,0,0,0.2105903662,0.6848089322,41.15086807,2016/3/26,4:35:51 
0.9,36.22683698,-115.0466482,1836.255238,0,0,0.2105903662,0.6848089322,41.15086807,2016/3/26,4:35:51 

Как вы можете видеть, первый у меня есть 9 значений с плавающей точкой, а затем 2 другие, которые я хотел бы нагрузку как строку. Сами разделяющие =,

Когда я использую:

load = np.genfromtxt(str(path), delimiter=',') 
print load[0,4] 

он выводит значение из строки 0, столбец 4, и она работает. Данные загружаются должным образом. Но есть проблема, потому что последние 2 значения nan

print load[0,10] 
>>nan 

Когда я изменить свой код в этом:

load = np.genfromtxt(str(path), delimiter=',',dtype=None) 

Я получаю сообщение об ошибке:

print load[0,4]
IndexError: too many indices for array

Так что все работает, если я добавить dtype=None

Что я делаю неправильно?

+0

Является много вопросов о 'genfromtxt' производящих 1d массива. Плакаты не понимают, что у него есть сложный 'dtype'. Читайте о 'структурированных' массивах. – hpaulj

+0

См. Http://stackoverflow.com/q/35699886/901925 – hpaulj

ответ

2

Вы не можете создать массив numpy с несколькими dtype. Вы должны импортировать файл CSV с dtype=str

import numpy as np 
load = np.genfromtxt(str(path), delimiter=',',dtype=str) 

С dtype=None создает Numpy массив с формой (3,). Поэтому вы не можете позвонить load[0, 4].

Каждая запись является кортежем с вашими данными. Поскольку кортежи могут содержать несколько типов.

может быть, для вашей цели вы должны использовать панд:

import pandas as pd 
load = pd.read_csv(str(path), header=None) 

выход заключается в следующем:

0   1   2   3 4 5  6   7 \ 

0 0.3 36.226837 -115.046648 1836.255238 0 0 0.21059 0.684809
1 0.6 36.226837 -115.046648 1836.255238 0 0 0.21059 0.684809
2 0.9 36.226837 -115.046648 1836.255238 0 0 0.21059 0.684809

 8   9  10 

0 41.150868 2016/3/26 4:35:51
1 41.150868 2016/3/26 4:35:51
2 41.150868 2016/3/26 4:35:51

каждый столбец имеет правильный dtype вывод на панд

+0

Хм, могу ли я создать две переменные, загрузить (с поплавковыми значениями) и load2 (с dtype = str), а затем объединить их? Кол. 1-8 от нагрузки и 9-10 от нагрузки 2? И как я мог это сделать? – Karmel

+0

нет. в numpy вы не можете создать массив смешанного типа. –

+0

ok, спасибо за ваш ответ – Karmel

1

Применяя ранее genfromtxt ответ на этот случай:

txt="""0.3,36.22683698,-115.0466482,1836.255238,0,0,0.2105903662,0.6848089322,41.15086807,2016/3/26,4:35:51 
... ...""" 
>>> load=np.genfromtxt(txt.splitlines(),dtype=None,delimiter=',') 
>>> load.shape 
(3,) 
>>> load.dtype 
dtype([('f0', '<f8'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8'), ('f4', '<i4'), ('f5', '<i4'), ('f6', '<f8'), ('f7', '<f8'), ('f8', '<f8'), ('f9', 'S9'), ('f10', 'S7')]) 

форма является 1d, но dtype представляет собой соединение, смесь поплавки, Интс и строк - 11 из их.

>>> load[0] 
(0.3, 36.22683698, -115.0466482, 1836.255238, 0, 0, 0.2105903662, 0.6848089322, 41.15086807, '2016/3/26', '4:35:51') 
>>> load['f0'] 
array([ 0.3, 0.6, 0.9]) 

«строк» ​​или записи доступны по количеству, но «» столбцы теперь поля, и доступ к ним по имени (вы можете получить имена из заголовков столбцов CSV, а также, здесь они генерируются автоматически).

>>> load[0]['f4'] 
0 
>>> load[0]['f3'] 
1836.255238 

Отдельные элементы - это доступ по сочетанию номера и имени.

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

С помощью этих данных можно определить 5 полей, сочетание поплавка, внутр и строка:

>>> dt=np.dtype('(4)float,(2)int,(3)float,S10,S10') 
>>> dt 
dtype([('f0', '<f8', (4,)), ('f1', '<i4', (2,)), ('f2', '<f8', (3,)), ('f3', 'S10'), ('f4', 'S10')]) 
>>> load=np.genfromtxt(txt.splitlines(),dtype=dt,delimiter=',') 

Теперь первое поле является (3,4) массив:

>>> load['f0'] 
array([[ 3.00000000e-01, 3.62268370e+01, -1.15046648e+02, 
      1.83625524e+03], 
     [ 6.00000000e-01, 3.62268370e+01, -1.15046648e+02, 
      1.83625524e+03], 
     [ 9.00000000e-01, 3.62268370e+01, -1.15046648e+02, 
      1.83625524e+03]]) 
>>> load['f1'] 
array([[0, 0], 
     [0, 0], 
     [0, 0]]) 

dt=np.dtype('(9)float,S10,S10') также работает, так как 2 столбца int могут загружаться как float.

Последние 2 столбца могут быть загружены как np.datetime64, хотя разделяющая их запятая может усложнить этот шаг.

Этих 9 числовых столбцов может быть извлечен из pandas нагрузки в массив numpy с плавающей точкой:

pload.values[:,:9].astype(float) 
pload.as_matrix(range(9)) 
Смежные вопросы