2013-06-30 32 views
5

Với mảng sau:Tìm hàng với tỷ lệ trung bình cao nhất trong một mảng NumPy

complete_matrix = numpy.array([ 
    [0, 1, 2, 4], 
    [1, 0, 3, 5], 
    [2, 3, 0, 6], 
    [4, 5, 6, 0]]) 

Tôi muốn xác định hàng với tỷ lệ trung bình cao nhất, không bao gồm số không đường chéo. Vì vậy, trong trường hợp này, tôi có thể xác định complete_matrix[:,3] là hàng có mức trung bình cao nhất.

Trả lời

2

Bạn không cần phải lo lắng về số 0, chúng sẽ không ảnh hưởng đến cách so sánh trung bình vì có thể sẽ là một trong mỗi hàng. Do đó, bạn có thể làm một cái gì đó như thế này để có được những chỉ số của hàng với tỷ lệ trung bình cao nhất:

>>> import numpy as np 
>>> complete_matrix = np.array([ 
...  [0, 1, 2, 4], 
...  [1, 0, 3, 5], 
...  [2, 3, 0, 6], 
...  [4, 5, 6, 0]]) 
>>> np.argmax(np.mean(complete_matrix, axis=1)) 
3 

tham khảo:

7

Lưu ý rằng sự hiện diện của các số không ảnh hưởng đến hàng nào có giá trị trung bình cao nhất vì tất cả các hàng có cùng số phần tử. Do đó, chúng ta chỉ lấy giá trị trung bình của mỗi hàng, và sau đó yêu cầu chỉ số của phần tử lớn nhất.

#Take the mean along the 1st index, ie collapse into a Nx1 array of means 
means = np.mean(complete_matrix, 1) 
#Now just get the index of the largest mean 
idx = np.argmax(means) 

idx giờ là chỉ mục của hàng có giá trị trung bình cao nhất!

4

Như được chỉ ra bởi nhiều người, sự hiện diện của số không phải là vấn đề miễn là bạn có cùng số lượng 0 trong mỗi cột. Chỉ trong trường hợp ý định của bạn là bỏ qua tất cả các số không, ngăn cản chúng tham gia vào tính toán trung bình, bạn có thể sử dụng trọng số để ngăn chặn sự đóng góp của các số không. Giải pháp sau chỉ định 0 trọng số cho các mục nhập bằng không, 1 cách khác:

numpy.argmax(numpy.average(complete_matrix,axis=0, weights=complete_matrix!=0)) 

Bạn luôn có thể tạo một ma trận trọng lượng có trọng số là 0 cho mục nhập đường chéo và 1 cách khác.

2

Bạn sẽ thấy rằng câu trả lời này thực sự sẽ fit better to your other question đã được đánh dấu là nhân đôi với trang này (và không biết tại sao vì nó không phải là cùng một câu hỏi ...)

Sự hiện diện của số không thể thực sự ảnh hưởng các cột hoặc hàng trung bình, ví dụ:

a = np.array([[ 0, 1, 0.9, 1], 
       [0.9, 0, 1, 1], 
       [ 1, 1, 0, 0.5]]) 

Nếu không loại bỏ các đường chéo, nó sẽ nói rằng column 3 có tỷ lệ trung bình cao nhất, nhưng loại bỏ các đường chéo tỷ lệ trung bình cao nhất thuộc về column 1 và bây giờ column 3 có ít nhất trung bình của tất cả các colum ns!

Bạn có thể sửa tính có nghĩa là sử dụng (nhiều nhất là phổ biến) lcm của số dòng có và không có đường chéo, bởi đảm bảo rằng nơi một yếu tố chéo không tồn tại việc sửa chữa không được áp dụng:

correction = column_sum/lcm(len(column), len(column)-1) 
new_mean = mean + correction 

tôi sao chép các thuật toán cho lcmfrom this answer và đề xuất một giải pháp cho trường hợp của bạn:

import numpy as np 

def gcd(a, b): 
    """Return greatest common divisor using Euclid's Algorithm.""" 
    while b: 
     a, b = b, a % b 
    return a 

def lcm(a, b): 
    """Return lowest common multiple.""" 
    return a * b // gcd(a, b) 

def mymean(a): 
    if len(a.diagonal()) < a.shape[1]: 
     tmp = np.hstack((a.diagonal()*0+1,0)) 
    else: 
     tmp = a.diagonal()*0+1 
    return np.mean(a, axis=0) + np.sum(a,axis=0)*tmp/lcm(a.shape[0],a.shape[0]-1) 

Testing với a đưa ra ở trên:

mymean(a) 
#array([ 0.95  , 1.  , 0.95  , 0.83333333]) 

Với một ví dụ khác:

b = np.array([[ 0, 1, 0.9, 0], 
       [0.9, 0, 1, 1], 
       [ 1, 1, 0, 0.5], 
       [0.9, 0.2, 1, 0], 
       [ 1, 1, 0.7, 0.5]]) 

mymean(b) 
#array([ 0.95, 0.8 , 0.9 , 0.5 ]) 

Với tỷ lệ trung bình chỉnh sửa mà bạn chỉ cần sử dụng np.argmax() để có được chỉ số cột với tỷ lệ trung bình cao nhất. Tương tự, np.argmin() để lấy chỉ mục của cột có mức trung bình thấp nhất:

np.argmin(mymean(a)) 
Các vấn đề liên quan