2014-10-17 22 views
5

Tôi muốn khẳng định rằng hai từ điển Python đều bằng nhau (nghĩa là: số lượng khóa bằng nhau và mỗi ánh xạ từ khóa đến giá trị bằng nhau; thứ tự không quan trọng). Tuy nhiên, cách đơn giản là assert A==B, điều này không hoạt động nếu các giá trị của từ điển là numpy arrays. Làm thế nào tôi có thể viết một hàm để kiểm tra chung nếu hai từ điển bằng nhau?So sánh hai từ điển với các ma trận cứng nhắc như các giá trị

>>> import numpy as np 
>>> A = {1: np.identity(5)} 
>>> B = {1: np.identity(5) + np.ones([5,5])} 
>>> A == B 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

EDIT Tôi biết rằng ma trận NumPy sẽ được kiểm tra bình đẳng với .all(). Những gì tôi đang tìm kiếm là một cách tổng quát để kiểm tra điều này, mà không cần phải kiểm tra isinstance(np.ndarray). Điều này có khả thi không?

chủ đề liên quan mà không cần mảng NumPy:

+0

Tôi nghĩ rằng bạn đang phải làm 'A [1] .all() == B [1] .all()' – EdChum

Trả lời

1

xem xét mã này

>>> import numpy as np 
>>> np.identity(5) 
array([[ 1., 0., 0., 0., 0.], 
     [ 0., 1., 0., 0., 0.], 
     [ 0., 0., 1., 0., 0.], 
     [ 0., 0., 0., 1., 0.], 
     [ 0., 0., 0., 0., 1.]]) 
>>> np.identity(5)+np.ones([5,5]) 
array([[ 2., 1., 1., 1., 1.], 
     [ 1., 2., 1., 1., 1.], 
     [ 1., 1., 2., 1., 1.], 
     [ 1., 1., 1., 2., 1.], 
     [ 1., 1., 1., 1., 2.]]) 
>>> np.identity(5) == np.identity(5)+np.ones([5,5]) 
array([[False, False, False, False, False], 
     [False, False, False, False, False], 
     [False, False, False, False, False], 
     [False, False, False, False, False], 
     [False, False, False, False, False]], dtype=bool) 
>>> 

Lưu ý là kết quả của việc so sánh là một ma trận, không phải là một giá trị boolean. So sánh dict sẽ so sánh các giá trị bằng cách sử dụng các giá trị cmp phương pháp, có nghĩa là khi so sánh các giá trị ma trận, so sánh dict sẽ nhận được kết quả tổng hợp. Những gì bạn muốn làm sử dụng numpy.all là sụp đổ mảng tổng hợp kết quả vào một kết quả boolean vô hướng

>>> np.all(np.identity(5) == np.identity(5)+np.ones([5,5])) 
False 
>>> np.all(np.identity(5) == np.identity(5)) 
True 
>>> 

Bạn sẽ cần phải viết chức năng riêng của mình để so sánh các bộ từ điển, các loại giá trị thử nghiệm để xem nếu họ matricies, và sau đó so sánh sử dụng numpy.all, nếu không hãy sử dụng ==. Tất nhiên, bạn luôn có thể ưa thích và bắt đầu phân lớp dict và quá tải cmp nếu bạn muốn.

+0

tôi đã không phải là rất rõ ràng về điều đó, nhưng tôi đã hy vọng một cách tổng quát mà không kiểm tra rõ ràng loại. Hôm nay nó là một mảng numpy, ngày mai nó là một loại tôi chưa bao giờ nghe nói về ngày hôm nay được nêu ra. – physicalattraction

+0

Tôi không nghĩ rằng có một cách xung quanh nó, tôi sợ. Nếu các loại (hoặc của người khác hoặc của người khác) ghi đè __cmp__ để trả về một phép so sánh python không vô hướng, sẽ không xử lý nó. – sirlark

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