次の配列があるとします。
complete_matrix = numpy.array([
[0, 1, 2, 4],
[1, 0, 3, 5],
[2, 3, 0, 6],
[4, 5, 6, 0]])
対角線のゼロを除いて、平均が最も高い行を特定したいと思います。complete_matrix[:,3]
したがって、この場合、平均が最も高い行であると識別できます。
すべての行に同じ数の要素があるため、ゼロの存在はどの行の平均が最も高いかに影響しないことに注意してください。したがって、各行の平均を取り、最大の要素のインデックスを求めます。
#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 は、平均値が最も高い行のインデックスになりました。
sについて心配する必要はありません0
。おそらく各行に 1 つあるため、平均の比較に影響を与えるべきではありません。したがって、次のようにして、平均が最も高い行のインデックスを取得できます。
>>> 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
参照:
この回答は、実際には、これと重複しているとマークされた他の質問により適していることがわかります(同じ質問ではないため、理由はわかりません...)
ゼロの存在は、実際に列または行の平均に影響を与える可能性があります。たとえば、次のようになります。
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
この回答からのアルゴリズムをコピーし、あなたのケースの解決策を提案しました:
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))