2012-05-12 39 views
9

Ví dụ: Tôi có a = np.array([123, 412, 444])b = np.array([123, 321])Numpy: Cách kiểm tra xem mảng có chứa các số nhất định không?

Tôi muốn biết nếu a chứa tất cả các yếu tố trong b. Có một hoạt động đơn giản cho điều này? Trong trường hợp này sẽ không đúng.

+0

Bạn có nghĩa là các yếu tố độc đáo không? a = [3,3,4], b = [3,4,5], là tất cả các phần tử chứa trong b? – Akavall

+0

Không, tôi có nghĩa là tất cả các phần tử trong b phải nằm trong a. Câu trả lời bên dưới nơi tôi đang tìm kiếm. Cảm ơn – luffe

Trả lời

10

Bạn có thể sử dụng chênh lệch cài đặt để xác định những gì bạn đang tìm kiếm. NumPy đã tích hợp chức năng gọi numpy.setdiff1d(ar1, ar2):

Return the sorted, unique values in ar1 that are not in ar2.

Ví dụ cho trường hợp của bạn:

>>> a = np.array([123, 412, 444]) 
>>> b = np.array([123, 321]) 
>>> diff = np.setdiff1d(b, a) 
>>> print diff 
array([321]) 
>>> if diff.size: 
>>> print "Not passed" 

Vì vậy, đối với trường hợp của bạn, bạn sẽ làm nên sự khác biệt set bạn sẽ trừ đi một từ b và có được một mảng với các phần tử trong b không nằm trong a. Sau đó, bạn có thể kiểm tra xem điều đó có trống hay không. Như bạn thấy, đầu ra là 312, là một mục có trong a nhưng không có trong b; chiều dài của nó bây giờ lớn hơn 0, do đó có các phần tử trong b không có trong a.

+0

Cảm ơn mọi người – luffe

+0

@luffe nếu tôi trả lời câu hỏi của bạn, vui lòng đánh dấu câu trả lời. – petr

+0

@petr tốt hơn để kiểm tra 'if diff' thay vì – jamylak

-1

bạn có thể làm:

a = an_array 
b = another_array 
for i in b: 
    if i not in a: 
     return False 
return True 
+0

Đó không phải là Python hợp lệ. Ngoài ra, một vòng lặp Python trên một mảng numpy là rất chậm. – rubik

+0

python không hợp lệ chính xác như thế nào? – cobie

+1

Rõ ràng là bạn chưa chạy nó trong trình thông dịch. Nếu bạn đã làm như vậy, bạn có thể đã phát hiện ra mã của bạn đặt ra một 'Cú pháp Cú pháp: 'trả về' bên ngoài hàm'. – rubik

2

có nghĩa là bạn muốn kiểm tra xem mỗi yếu tố của b được chứa trong một. in1d nào đó:

from numpy import array, in1d 
a = array([123, 412, 444]) 
b = array([123, 321]) 
print in1d(b, a).all() 
12

Bạn nhất luôn có thể sử dụng một bộ:

>>> a = numpy.array([123, 412, 444]) 
>>> b = numpy.array([123, 321]) 
>>> set(b) in set(a) 
False 

Hoặc với các phiên bản mới hơn của NumPy:

>>> numpy.in1d(b,a) 
array([ True, False], dtype=bool) 

Nếu bạn chỉ muốn 'câu trả lời' hơn một mảng:

>>> numpy.in1d(b,a).all() 
False 

Hoặc (ít mong muốn):

>>> numpy.array([x in a for x in b]) 
array([ True, False], dtype=bool) 

Vòng lặp chậm trên mảng cứng và cần tránh.

+0

'set (b) trong set (a)' có thể không làm những gì bạn muốn, đó sẽ là 'set.is [super | sub] set'. – TryPyPy

+0

Tại sao đặt (b) trong bộ (a) không hoạt động? – Arturo

Các vấn đề liên quan