2015-08-03 2 views
0

Я пытаюсь фильтровать мой ndarray другого массива я собрал (с теми же значениями)фильтра массива NumPy

Моим главным ndarray выглядит

[['Name' 'Col1' 'Count'] 
['test' '' '413'] 
['erd' ' ' '60'] 
..., 
['Td1' 'f' '904'] 
['Td2' 'K' '953'] 
['Td3' 'r' '111']] 

У меня есть еще один список с различными именами согласующих

names = ['Td1','test','erd'] 

Что я хотел бы сделать

Я хотел бы использовать имена списков в качестве фильтра против ndarray выше?

Что я Пробовал

name_filter = main_ndarray[:,0] == names 

Это не работает

Что я Ожидать

[['Name' 'Col1' 'Count'] 
['test' '' '413'] 
['erd' ' ' '60'] 
['Td1' 'f' '904']] 

ответ

1

Рассмотрите возможность использования панд для этого вида данных:

import pandas as pd 

data = [['Name', 'Col1', 'Count'], 
     ['test', '', '413'], 
     ['erd', ' ', '60'], 
     ['Td1', 'f', '904'], 
     ['Td2', 'K', '953'], 
     ['Td3', 'r', '111']] 

df = pd.DataFrame(data[1:], columns=data[0]) 
names = ['Td1','test','erd'] 
result = df[df.Name.isin(names)] 

Результаты:

>>> df 
    Name Col1 Count 
0 test  413 
1 erd   60 
2 Td1 f 904 
3 Td2 K 953 
4 Td3 r 111 
>>> result 
    Name Col1 Count 
0 test  413 
1 erd   60 
2 Td1 f 904 
>>> 

Ссылки

1

Вы можете использовать функцию filter тоже.

cats_array = numpy.array(
[['Name' ,'Col1', 'Count'], 
['test', '' ,'413'], 
['erd' ,' ' ,'60'], 
['Td1' ,'f' ,'904'], 
['Td2' ,'K' ,'953'], 
['Td3' ,'r', '111']] 
) 

names = ['Td1','test','erd'] 

filter(lambda x: x[0] in names, cats_array) 

дает:

[array(['test', '', '413'], 
     dtype='|S5'), array(['erd', ' ', '60'], 
     dtype='|S5'), array(['Td1', 'f', '904'], 
     dtype='|S5')] 
+0

Итак, из любопытства, что мне теперь делать с этим массивом? он не сохранил «регулярное» форматирование. Теперь он имеет этот dtype, а значения в индексе 1 полностью отделены от смежного массива. – cat

+1

@cat. Вы можете нанести удар по нему с помощью карты (lambda a: list (a), filter (lambda x: x [0] в именах , cats_array)) ', чтобы сохранить форматирование в виде списка. Если вы это сделаете, ваш ответ будет «[['test', '', '413'], ['erd', '', '60'], ['Td1', 'f', '904'] ] ' – Nitish

1

Я хотел бы также пойти с @ YXD, решение которого панды, но только ради полноты я также обеспечивают простое решение, основанное на списке понимание:

data = [['Name', 'Col1', 'Count'], 
['test', '', '413'], 
['erd', ' ', '60'], 
['Td1', 'f', '904'], 
['Td2', 'K', '953'], 
['Td3', 'r', '111']] 

names = ['Td1', 'test', 'erd'] 

# select all sublist of data 
res = [l for l in data if l[0] in names] 

# insert the first row of data 
res.insert(0, data[0]) 

который затем выдаст желаемый результат:

[['Name', 'Col1', 'Count'], 
['test', '', '413'], 
['erd', ' ', '60'], 
['Td1', 'f', '904']] 
Смежные вопросы