2016-03-18 2 views
0

Можно ли исключить все столбцы строк, используя genfromtxt из библиотеки numpy?Исключить столбцы из genfromtxt с numpy

У меня есть файл csv с данными такого типа от сайт машинного обучения.

antelope,1,0,0,1,0,0,0,1,1,1,0,0,4,1,0,1,1 

В настоящее время с моими настройками np.genfromtxt(path, dtype=float, names=None,delimiter=',') он маркирует строку как nan, которая имеет смысл, но я хотел бы, чтобы исключить все столбцы, строка.

Я знаю, что есть параметр usecols=(1,2), но это потребует от меня указать этот или каждый набор данных, который мне нужно использовать. Я скорее предпочитаю метод исключения, а не метод включения.

Должен ли я использовать другой метод или обрабатывать каждую строку самостоятельно?

+0

Есть ли конкретная причина, по которой вам нужно использовать 'genfromtxt'? Это довольно простой пример использования [pandas] (http://pandas.pydata.org/) DataFrame. –

+0

Нет. Я не в коробке с библиотеками. Как бы вы это сделали в панде? – lzc

ответ

1

pandas имеет метод DataFrame.select_dtypes, который позволит вам сделать это довольно легко. Вы можете получить данные в DataFrame либо непосредственно (как в приведенном ниже примере), или с помощью одного из различных способов чтения (например, pd.read_csv()):

In [21]: import pandas as pd 

In [22]: df = pd.DataFrame({'a': [1,2,3,4,5], 'b': ['a','b','c','d','e'], 'c': [1.1, 2.2, 3.3, 4.4, 5.5]}) 

In [23]: df 
Out[23]: 
    a b c 
0 1 a 1.1 
1 2 b 2.2 
2 3 c 3.3 
3 4 d 4.4 
4 5 e 5.5 

In [24]: df.select_dtypes([int, float]) 
Out[24]: 
    a c 
0 1 1.1 
1 2 2.2 
2 3 3.3 
3 4 4.4 
4 5 5.5 
1

Вы можете отфильтровать столбцы с nan после прочтения.

In [52]: txt=b'antelope,1,0,0,1,0,0,0,1,1,1,0,0,4,1,0,1,1' 
In [53]: txt=[txt,txt] 
In [54]: A=np.genfromtxt(txt, dtype=float, names=None,delimiter=',') 
In [55]: A 
Out[55]: 
array([[ nan, 1., 0., 0., 1., 0., 0., 0., 1., 1., 1., 
      0., 0., 4., 1., 0., 1., 1.], 
     [ nan, 1., 0., 0., 1., 0., 0., 0., 1., 1., 1., 
      0., 0., 4., 1., 0., 1., 1.]]) 

колонки с nan во всех рядах; или я мог бы использовать .any для столбцов с любыми nan. Другие тесты возможны.

In [56]: ind=np.isnan(A).all(axis=0) 
In [57]: ind 
Out[57]: 
array([ True, False, False, False, False, False, False, False, False, 
     False, False, False, False, False, False, False, False, False], dtype=bool) 
In [58]: A[:,~ind] 
Out[58]: 
array([[ 1., 0., 0., 1., 0., 0., 0., 1., 1., 1., 0., 0., 4., 
     1., 0., 1., 1.], 
     [ 1., 0., 0., 1., 0., 0., 0., 1., 1., 1., 0., 0., 4., 
     1., 0., 1., 1.]]) 

Другая идея состоит в том, чтобы один раз прочитать файл с dtype=None, позволяя genfromtxt выбрать DTYPE для каждого столбца. Получающееся в результате соединение dtype может быть фильтром для поиска столбцов желаемого типа.

In [118]: A=np.genfromtxt(txt, dtype=None, names=None,delimiter=',') 
In [119]: ind=[i for i, d in enumerate(A.dtype.descr) if d[1]=='<i4'] 
In [120]: A=np.genfromtxt(txt, dtype=None, names=None,delimiter=',',usecols=ind) 
In [121]: A 
Out[121]: 
array([[1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 4, 1, 0, 1, 1], 
     [1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 4, 1, 0, 1, 1]]) 

DTYPE также может быть отфильтрован, чтобы собрать имена столбцов, которые являются правильным типом

In [128]: A=np.genfromtxt(txt, dtype=None, names=None,delimiter=',') 
In [129]: ind=[d[0] for d in A.dtype.descr if d[1]=='<i4'] 
In [130]: A[ind] 
Out[130]: 
array([(1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 4, 1, 0, 1, 1), 
     (1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 4, 1, 0, 1, 1)], 
     dtype=[('f1', '<i4'), ('f2', '<i4'), ('f3', '<i4'), ('f4', '<i4'), ('f5', '<i4'), ('f6', '<i4'), ('f7', '<i4'), ('f8', '<i4'), ('f9', '<i4'), ('f10', '<i4'), ('f11', '<i4'), ('f12', '<i4'), ('f13', '<i4'), ('f14', '<i4'), ('f15', '<i4'), ('f16', '<i4'), ('f17', '<i4')]) 

Хотя консолидации этого структурированного массива в 2D-массив с одним DTYPE (INT), это немного боль (я мог бы вдаваться в подробности, если это необходимо).

Смежные вопросы