2014-12-29 25 views
5

Tôi có 13 python NumPy mảng:Kiểm tra nếu một mảng là yếu tố của một danh sách các mảng

obj_1=np.array([784,785,786,787,788,789,790,791,792]) 
obj_2=np.array([716,717,718,730,731,732,721,722,724,726,727]) 
obj_3=np.array([658,659,660,661,662,663,664,665]) 
obj_4=np.array([581,582,583,589,590,591,595,597,598,599,601,605,606,613,614]) 
obj_5=np.array([533,534,535,536,537]) 
obj_6=np.array([464,469,472,474]) 
obj_7=np.array([406,409,411,412]) 
obj_8=np.array([345,346,347,349]) 
obj_9=np.array([277,278,281,282,283,284,288,296]) 
obj_10=np.array([217,219,220,223,224]) 
obj_11=np.array([154,155,156,157,158,159,160,161]) 
obj_12=np.array([91,92,93,94,95,96,97]) 
obj_13=np.array([28,29,30,31,32,33,34]) 

Sau đó, vòng lặp sau:

for i in [obj_1, obj_2, obj_3, obj_4, obj_5, obj_6, obj_7, obj_8, obj_9, obj_10, obj_11, obj_12, obj_13]: 
    print i in [obj_1, obj_2, obj_3, obj_4, obj_5, obj_6, obj_7, obj_8, obj_9] 

Tôi mong chờ kết quả này:

True 
True 
True 
True 
True 
True 
True 
True 
True 
False 
False 
False 
False 

Thay vào đó tôi nhận được thông báo lỗi sau:

True 
True 
True 
True 
True 
True 
Traceback (most recent call last): 

File "<ipython-input-221-c03c1ef308c6>", line 16, in <module> 
print i in [obj_1, obj_2, obj_3, obj_4, obj_5, obj_6, obj_7, obj_8, obj_9] 

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

Tôi đã thử nghiệm các mảng khác nhau có cùng tên và giống nhau cho vòng lặp; họ không tạo ra lỗi.

Có vẻ như vấn đề nằm trong nội dung của mảng, nhưng tôi không thể tìm ra vị trí.

Có ai có ý tưởng tại sao điều này xảy ra không?

+0

Ý anh là một tập hợp con? Bạn có biết 'obj_1' đến' obj_9' luôn nằm trong danh sách mảng không? 10,11,12,13 là những người duy nhất bạn không có trong nó –

+0

Bạn có thể cần '.tolist()' nhưng tôi thực sự không nhìn thấy những gì bạn đang cố gắng để làm –

+0

Tôi không thể thấy làm thế nào lỗi này có thể đến từ mã này - bạn dường như không kiểm tra giá trị chân lý của bất kỳ mảng nào. – rlms

Trả lời

4

Khi bạn làm obj in list python so sánh obj để bình đẳng với từng thành viên trong danh sách. Vấn đề là các nhà điều hành bình đẳng trong numpy không hành xử một cách nhất quán. Ví dụ:

>>> obj_3 == obj_6 
False 

vì chúng có độ dài khác nhau, boolean được trả về.

>>> obj_7==obj_6 
array([False, False, False, False], dtype=bool) 

vì chúng có cùng độ dài, mảng được so sánh với yếu tố khôn ngoan và mảng được trả lại. Trong trường hợp này, giá trị chân lý chưa được xác định. Có vẻ như hành vi kỳ lạ này sẽ là change in the future.

Cách đúng để làm điều đó sẽ được so sánh riêng từng cặp mảng sử dụng ví dụ numpy.array_equal:

for i in [obj_1, obj_2, obj_3, obj_4, obj_5, obj_6, obj_7, obj_8, obj_9, obj_10, obj_11, obj_12, obj_13]: 
    print any(np.array_equal(i, j) for j in [obj_1, obj_2, obj_3, obj_4, obj_5, obj_6, obj_7, obj_8, obj_9]) 

giúp bạn:

True 
True 
True 
True 
True 
True 
True 
True 
True 
False 
False 
False 
False 
+2

Ah phải rồi. Để giải thích thêm: 'a' trong' [b, c, d] 'về cơ bản kiểm tra' bool (a == b) ',' bool (a == c) ',' bool (a == d) 'và nếu 'a' và' c' có cùng độ dài, nó trả về một mảng, không thể xác định giá trị thực của nó. – Claudiu

+1

Tôi nghĩ rằng điều này là chính xác nhưng, để được pedantic, có vẻ như là 'id' (hoặc một cái gì đó tương tự) được sử dụng để so sánh các mảng _before_ thử nghiệm cho bình đẳng. Ví dụ, 'obj_1 trong [obj_1]' trả về 'True' mặc dù' bool (obj_1 == obj_1) 'gây ra lỗi. Các thử nghiệm cho bình đẳng không xảy ra đầu tiên. –

+0

cảm ơn rất nhiều, @elyase, bạn đã giải quyết được vấn đề của mình! – orieger

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