2014-04-16 9 views
5

Używam języka Python. Jak dokonać podsekcji wektora na podstawie wartości dwóch innych wektorów o tej samej długości?Utwórz podzbiór tablicy na podstawie wartości dwóch innych tablic w języku Python

Na przykład to trzy wektory

c1 = np.array([1,9,3,5]) 
c2 = np.array([2,2,3,2]) 
c3 = np.array([2,3,2,3]) 

c2==2 
array([ True, True, False, True], dtype=bool) 
c3==3 
array([False, True, False, True], dtype=bool) 

chcę zrobić coś takiego:

elem = (c2==2 and c3==3) 
c1sel = c1[elem] 

ale pierwsze wyniki oświadczenie w błąd:

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
ValueError: The truth value of an array with more than one element is ambiguous. 
Use a.any() or a.all() 

w Matlab, Chciałbym użyć:

elem = find(c2==2 & c3==3); 
c1sel = c1(elem); 

Jak to zrobić w języku Python?

Odpowiedz

5

Można użyć numpy.logical_and:

>>> c1[np.logical_and(c2==2, c3==3)] 
array([9, 5]) 
+0

Dziękuję, to działa bez zarzutu! – vincentv

+0

O ile widzę, nie działa to dla więcej niż dwóch warunków. Dla trzech lub więcej, używam rozwiązania mskimm. – vincentv

3

Ewentualnie spróbuj

>>> c1[(c2==2) & (c3==3)] 
array([9, 5]) 

CF) Przez Python Operator Precedence, priorytet & jest wyższa niż ==. Zobacz następujące wyniki.

>>> 1 == 1 & 2 == 2 
False 

>>> (1 == 1) & (2 == 2) 
True 
+0

Nadal nie rozumiem różnicy między "i" a "i". Przeczytam o tym więcej. – vincentv

+0

patrz http://stackoverflow.com/questions/3845018/python-boolean-operators-vs-bitwise-operators – emeth

1

Trzeba zachować każdego z warunków wewnątrz nawiasu:

In []: c1[(c2 == 2) & (c3 == 3)] 
Out[]: array([9, 5]) 
Powiązane problemy