2015-03-02 3 views
0

Возможно ли оптимизировать/векторизовать код ниже? Прямо сейчас это не похоже на правильный способ делать вещи, и это не очень «пифонично». Код предназначен для работы с огромными наборами данных, поэтому производительность очень важна.Python numpy list filtering

Идея состоит в том, чтобы удалить все значения и их имена, которые не встречаются в обоих списках.

E.g. Результатом приведенного ниже кода будет два списка с именами «name2» и «name4», имеющими значения [2,4] и [5,6] соответственно.

import numpy as np 

names1=np.array(["name1","name2","name3","name4"]) 
names2=np.array(["name2","name4","name5","name6"]) 

pos1=np.array([1,2,3,4]) 
pos2=np.array([5,6,7,8]) 


for entry in names2: 
    if not np.any(names1==entry): 
     pointer=np.where(names2==entry) 
     pos2=np.delete(pos2,pointer) 
     names2=np.delete(names2,pointer) 

for entry in names1: 
    if not np.any(names2==entry): 
     pointer=np.where(names1==entry) 

     pos1=np.delete(pos1,pointer) 
     names1=np.delete(names1,pointer) 
+1

Вы преданы использованию 'numpy' для этого? Это больше похоже на проблему «панд». – DSM

+0

У меня нет опыта работы с пандами. Любые намеки –

ответ

0

Вот Векторизованный ответ:

import numpy as np 

names1=np.array(["name1","name2","name3","name4"]) 
names2=np.array(["name2","name4","name5","name6"]) 

pos1=np.array([1,2,3,4]) 
pos2=np.array([5,6,7,8]) 

intersection=np.intersect1d(names1,names2) 
pointer1=np.argwhere(np.in1d(names1, intersection) == False) 
pointer2=np.argwhere(np.in1d(names2, intersection) == False) 

pos2=np.delete(pos2,pointer2) 
names2=np.delete(names2,pointer2) 

pos1=np.delete(pos1,pointer1) 
names1=np.delete(names1,pointer1) 
0

FWIW, это просто merge операции в pandas:

>>> df1 = pd.DataFrame({"name": names1, "pos": pos1}) 
>>> df2 = pd.DataFrame({"name": names2, "pos": pos2}) 
>>> df1 
    name pos 
0 name1 1 
1 name2 2 
2 name3 3 
3 name4 4 
>>> df2 
    name pos 
0 name2 5 
1 name4 6 
2 name5 7 
3 name6 8 
>>> df1.merge(df2, on="name", suffixes=[1,2]) 
    name pos1 pos2 
0 name2  2  5 
1 name4  4  6