繁体   English   中英

如何计算三角相似矩阵的加权平均值

[英]How to calculate weighted average on a traingular similarity matrix

我有一个像这样的三角相似矩阵。

[[3, 1, 2, 0],
 [1, 3, 0, 0],
 [1, 0, 0, 0],
 [0, 0, 0, 0]]

如何在丢弃零元素的同时计算每行的加权平均值?

您可以沿第二个轴添加,然后除以每行非零值的sum 然后使用np.divide中的where你可以在满足条件的地方进行划分,通过将其设置为指定非零值的掩码,你可以防止除以零错误:

a = np.array([[3, 1, 2, 0],
              [1, 3, 0, 0],
              [1, 0, 0, 0],
              [0, 0, 0, 0]])

m = (a!=0).sum(1)
np.divide(a.sum(1), m, where=m!=0)
# array([2., 2., 1., 0.])

遍历每一行,然后遍历每个元素。 遍历元素时,不要包含零。 如果您只找到零元素,只需将零(或任何您想要的默认值)添加到您的列表中。

weighted_averages = []
for row in matrix:
  total_weight = 0
  number_of_weights = 0
  for element in row:
    if element != 0:
      total_weight += element
      number_of_weights += 1
  if number_of_weights == 0:
    weighted_averages.append(0)
  else:
    weighted_averages.append(total_weight/number_of_weights)

您的情况下的weighted_averages返回为: [2.0, 2.0, 1.0, 0]

您可以使用 numpy 来计算加权平均值。

import numpy as np
a = np.array([
 [3, 1, 2, 0],
 [1, 3, 0, 0],
 [1, 0, 0, 0],
 [0, 0, 0, 0]
])
weights = np.array([1,2,3,4])
#create an mask where element is 0
ma = np.ma.masked_equal(a,0)
#take masked weighted average
ans = np.ma.average(ma, weights=weights,axis = 1)
#fill masked points as 0
ans.filled(0)

Output:

array([1.83333333, 2.33333333, 1.        , 0.        ])

只是 Python:

ar = [[3, 1, 2, 0],
 [1, 3, 0, 0],
 [1, 0, 0, 0],
 [0, 0, 0, 0]]
weight = [1,2,3,4]
ans=[]
for li in ar:
    wa = 0 #weighted average
    we = 0 #weights
    for index,ele in enumerate(li): 
        if ele !=0:
            wa+=weight[index]*ele
            we+=weight[index]
    if we!=0:
        ans.append(wa/we)
    else:
        ans.append(0)
ans

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM