给出以下数组:
complete_matrix = numpy.array([
[0, 1, 2, 4],
[1, 0, 3, 5],
[2, 3, 0, 6],
[4, 5, 6, 0]])
我想确定平均值最高的行,不包括对角线零。
因此,在这种情况下,我可以将complete_matrix[:,3]
标识为平均值最高的行。
答案 0 :(得分:7)
请注意,零的存在不会影响哪一行具有最高平均值,因为所有行都具有相同数量的元素。因此,我们只取每行的均值,然后询问最大元素的索引。
#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现在是具有最高平均值的行的索引!
答案 1 :(得分:4)
正如很多人所指出的那样,只要每列中的零个数相同,就不存在零。如果您的意图是忽略所有零,阻止它们参与平均计算,您可以使用权重来抑制零的贡献。以下解决方案将0权重分配给零条目,否则为1:
numpy.argmax(numpy.average(complete_matrix,axis=0, weights=complete_matrix!=0))
您始终可以创建权重矩阵,其中对角线条目的权重为0,否则为1。
答案 2 :(得分:3)
你不必担心0
,它们不应该影响平均值的比较,因为每行可能会有一个。因此,您可以执行以下操作来获取具有最高平均值的行的索引:
>>> 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
<强>参考:强>
答案 3 :(得分:2)
你会看到这个答案实际上会fit better to your other question被标记为与此重复(并且不知道为什么,因为它不是同一个问题......)
零的存在确实会影响列或行的平均值,例如:
a = np.array([[ 0, 1, 0.9, 1],
[0.9, 0, 1, 1],
[ 1, 1, 0, 0.5]])
在不删除对角线的情况下,它会告诉column 3
平均值最高,但是消除对角线的平均值最高属于column 1
,现在column 3
的平均值最低列!
您可以使用带有和不带对角线的行数的lcm
(最小公倍数)来校正计算出的平均值,方法是保证对角元素不存在的位置不应用校正:
correction = column_sum/lcm(len(column), len(column)-1)
new_mean = mean + correction
我复制了lcm
from this answer的算法并为您的案例提出了解决方案:
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)
使用上面给出的a
进行测试:
mymean(a)
#array([ 0.95 , 1. , 0.95 , 0.83333333])
另一个例子:
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 ])
使用更正后的平均值,您只需使用np.argmax()
即可获得平均值最高的列索引。同样,np.argmin()
获取平均值最小的列的索引:
np.argmin(mymean(a))