2014-04-16 21 views
5

Tôi đang sử dụng Python. Làm thế nào để thực hiện một subselection của một vector, dựa trên các giá trị của hai vector khác với cùng một chiều dài?Tạo tập con của mảng, dựa trên giá trị của hai mảng khác trong Python

Ví dụ này ba vectơ

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) 

tôi muốn làm một cái gì đó như thế này:

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

Nhưng kết quả tuyên bố đầu tiên trong một lỗi:

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() 

Trong Matlab, Tôi sẽ sử dụng:

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

Làm cách nào để thực hiện việc này bằng Python?

Trả lời

5

Bạn có thể sử dụng numpy.logical_and:

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

Cảm ơn bạn, điều này hoạt động tốt! – vincentv

+0

Theo như tôi thấy, điều này không làm việc cho hơn hai điều kiện. Đối với ba hoặc nhiều hơn, tôi sử dụng các giải pháp của mskimm. – vincentv

3

Ngoài ra, hãy thử

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

cf) By Python Operator Precedence, ưu tiên của & là cao hơn so với ==. Xem kết quả sau.

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

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

Tôi vẫn không hiểu sự khác biệt giữa 'và' và '&'. Tôi sẽ đọc thêm về nó. – vincentv

+0

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

1

Bạn cần phải giữ cho mỗi điều kiện của bạn bên trong ngoặc đơn:

In []: c1[(c2 == 2) & (c3 == 3)] 
Out[]: array([9, 5]) 
Các vấn đề liên quan