2012-02-15 31 views
13

Tôi có hai mảng NumPy, ví dụ:Làm thế nào để lọc một mảng numpy bằng cách sử dụng các giá trị của mảng khác?

a = [1,2,3,4,5] 

và một mảng lọc, ví dụ:

f = [False, True, False, False, True] 

len(a) == len(f) 

Làm thế nào tôi có thể nhận được một mảng NumPy mới chỉ có các giá trị trong một nơi chỉ số tương tự ở f là True? Trong trường hợp của tôi: [2, 5].

Theo giải pháp được chấp nhận (với các giá trị khác nhau):

>>> a = numpy.array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) 
>>> b = numpy.array([True, False, True, False, True, False, True, False, True, False]) 
>>> a[b] 
array([1, 3, 5, 7, 9]) 
+2

có vẻ như b là một danh sách không phải là mảng, b phải là một mảng boolean. Hãy thử 'b = np.asarray (b, 'bool')' –

Trả lời

22

NumPy hỗ trợ boolean indexing

a[f] 

này giả định rằng af là mảng NumPy chứ không phải là danh sách Python (như trong câu hỏi). Bạn có thể chuyển đổi với f = np.array(f).

+0

Điều này dường như không hoạt động: xem câu hỏi. –

+2

Đảm bảo 'b' là mảng có nhiều mảng. Đã cập nhật trong câu trả lời. – YXD

+1

Tôi đã thay đổi nó theo giải pháp của bạn và bình luận trong câu hỏi ... bây giờ nó hoạt động, cảm ơn bạn! –

3

Nếu bạn chưa cần mảng NumPy, đây là một danh sách đơn giản:

import itertools 
print itertools.compress(a, f) 

Đối với tiền 2,7 phiên bản của python, bạn phải cuộn của riêng bạn (xem thủ công):

def compress(data, selectors): 
    return (d for d, s in itertools.izip(data, selectors) if s) 
Các vấn đề liên quan