2016-03-15 2 views
1

У меня есть 6 массивов, допустим, a,b,c1,d1,c2,d2.Получение значений набора в Python

Массивы a and b имеют некоторые общие пары c1,c2 и d1,d2. Я нахожу эти общие пары, т.е. те a and b, которые имеют тот же c1,d1 и c2,d2 вроде этого:

data_zcosmo_lastz = a 
data_zphot_lastz = b 
halo_id_zcosmo = c1 
halo_id_zphot = c2 
idrep_zcosmo = d1 
idrep_zphot = d2 


file2freq1 = Counter(zip(c1,d1)) 
file2freq2 = Counter(zip(c2,d2)) 

set_a = set(file2freq1) & set(file2freq2) # common objects 

Приведенный выше код дает set_a иметь те общие ценности c1,d1 и c2,d2.

Но как я могу получить значения a and b из set_a?

т.е. я хочу, a и b значения set_a.

Пример

a = [1,2,3,4,5] 
b = [2,3,4,5,6] 
c1 = [1,1,1,2,2] 
d1 = [3,3,3,4,4] 
c2 = [1,1,2,2,2] 
d2 = [3,3,1,4,4] 

so set_a = [(1,3),(1,3),(2,4),(2,4)] 

Теперь я хочу, чтобы эти значения a and b, которые имеют эти пары. то есть

a = [1,2,4,5] and b = [2,3,5,6] 
+1

«Но как мне получить значения a и b из set_a?» Что вы имеете в виду? Индексы? Не могли бы вы показать минимальный пример для входных массивов и то, что вы хотите получить в конце? –

+0

@tobias_k: отредактировал вопрос на примере. Надеюсь, это упростит понимание. Я хочу не только индексы, но и значения 'a' и' b', которые принадлежат этому 'set_a' – ThePredator

+1

. Соответствующие пары c1/d1 и c2/d2 должны совпадать, как и в вашем примере? Используя 'set' и' Counter', вы теряете эту информацию. –

ответ

1

Все еще не на 100%, что вы просите. Насколько я понимаю, вам нужны элементы a и b в тех положениях, где элементы c1 и d1 являются такими же, как у c2 и d2 соответственно.

В этом случае использование set и Counter не поможет, так как они будут удалять любую информацию о местоположении. Вместо этого, просто zip все эти списки вместе ...

for a_, b_, c1_, d1_, c2_, d2_ in zip(a,b,c1,d1,c2,d2): 
    if (c1_,d1_) == (c2_,d2_): 
     print(a_, b_) 

... или просто zip в c1,d1,c2,d2 списки и использовать enumerate, чтобы получить позиции:

idx = [i for i, t in enumerate(zip(c1,d1,c2,d2)) if t[:2] == t[2:]] 
print([(a[i], b[i]) for i in idx]) 

В качестве альтернативы, вы можете также используйте numpy для этого, после преобразования ваших массивов в numpy.arrays, например A = np.array(a) и так далее.

>>> match = np.logical_and(C1 == C2, D1 == D2) 
>>> match 
array([ True, True, False, True, True], dtype=bool) 
>>> A[match] 
array([1, 2, 4, 5]) 
>>> B[match] 
array([2, 3, 5, 6]) 
Смежные вопросы