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 lcm
from 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))