2011-07-14 12 views
10

Tôi có hai mảng có kích thước bằng nhau (chúng xảy ra là 48x365) trong đó mỗi phần tử là -1, 0 hoặc 1. Tôi muốn so sánh hai phần tử và xem chúng bao nhiêu lần cả hai đều giống nhau và bao nhiêu lần chúng khác nhau trong khi giảm giá tất cả các lần mà ít nhất một trong các mảng có số không là không có dữ liệu. Ví dụ:So sánh hai mảng numpy với nhau

for x in range(48): 
    for y in range(365): 
     if array1[x][y] != 0: 
      if array2[x][y] != 0: 
       if array1[x][y] == array2[x][y]: 
        score = score + 1 
       else: 
        score = score - 1 
return score 

Quá trình này mất rất nhiều thời gian. Tôi đã suy nghĩ để tận dụng lợi thế của thực tế là nhân các yếu tố với nhau và tổng hợp tất cả các câu trả lời có thể cho kết quả tương tự, và tôi đang tìm kiếm một chức năng đặc biệt để giúp đỡ với điều đó. Tôi không thực sự chắc chắn những gì chức năng bất thường gumpy được ra khỏi đó.

Trả lời

12

Simpy không lặp lại. Lặp lại trên một mảng numpy đánh bại mục đích của việc sử dụng công cụ.

ans = np.logical_and(
    np.logical_and(array1 != 0, array2 != 0), 
    array1 == array2) 

nên đưa ra giải pháp đúng.

+0

Ý tưởng hay! Nhưng điều này mang lại cho tôi một mảng boolean. Tôi vẫn cần tổng hợp tất cả True để có điểm số. Có cách nào để làm điều đó không? –

+1

. 'np.sum (ans)' – Paul

+0

bạn cũng có thể sử dụng 'np.sum (mảng1 [ans])' hoặc 'np.sum (mảng2 [ans])' nếu bạn muốn tổng hợp bởi chính nó. mỗi khi bạn có một 'false' như một mục, nó sẽ không tính đến giá trị. – ahelm

0

tính toán đơn giản dọc theo dòng sau đây, sẽ giúp bạn chọn cách phù hợp nhất để xử lý trường hợp của bạn:

In []: A, B= randint(-1, 2, size= (48, 365)), randint(-1, 2, size= (48, 365)) 
In []: ignore= (0== A)| (0== B) 
In []: valid= ~ignore 

In []: (A[valid]== B[valid]).sum() 
Out[]: 3841 
In []: (A[valid]!= B[valid]).sum() 
Out[]: 3849 
In []: ignore.sum() 
Out[]: 9830 

Đảm bảo rằng các tính toán có giá trị:

In []: 3841+ 3849+ 9830== 48* 365 
Out[]: True 

Do đó score của bạn (với các giá trị ngẫu nhiên này) sẽ là:

In []: a, b= A[valid], B[valid] 
In []: score= (a== b).sum()- (a!= b).sum() 
In []: score 
Out[]: -8 
6

Fo r tôi cách dễ nhất là làm điều này:

A = numpy.array() 
B = numpy.array() 

T = A - B 
max = numpy.max(numpy.abs(T)) 

epsilon = 1e-6 
if max > epsilon: 
    raise Exception("Not matching arrays") 

Nó cho phép biết nhanh chóng nếu mảng giống nhau và cho phép so sánh giá trị float !!

+1

Một giải pháp tổng quát hơn một chút so với OP được yêu cầu nhưng thực sự rất hữu ích! – petr

0
import numpy as np 

A = np.array() 
B = np.array() 
... 
Z = np.array() 

to_test = np.array([A, B, .., Z]) 

# compare linewise if all lines are equal 
np.all(map(lambda x: np.all(x==to_test[0,:]), to_test[1:,:]))