给出一个n
×n
方阵M
的方法,该如何有效地找到所有(i,j)
,0 <= i,j < n
没有k
的地方, 0 <= k < n
这样:
M[i,j] < M[k,j]
M[i,j] < M[i,k]
M[i,j] < M[j,k]
M[i,j] < M[k,i]
我们可以假设所有M[i,i] == 0
的矩阵都是i
的对角线。
我想要最好的算法和最快的numpy / Python实现。
我尝试了以下方法:
maxcol = np.argmax(scores,axis=1)
maxrow = np.argmax(scores,axis=0)
pairs = []
seen = set([])
for i1 in xrange(M.shape[0]):
j1 = maxcol[i]
if (not i1 in seen) and maxrow[j1] == i1:
seen.add(j1)
i2 = j1
j2 = maxcol[i2]
if (not j1 in seen) and maxrow[j2] == i2 and M[i2,j2] > M[i1,j1]:
pairs.append([i2,j2])
seen.add(j2)
else:
pairs.append([i1,j1])
但是它看起来很混乱,所以我不信任它。我也希望有一个更优雅的解决方案。
答案 0 :(得分:1)
让我们以下面的矩阵为例:
import numpy as np
M = np.array([[0,8,2,3,4,5],[0,0,3,9,1,7],[0,0,0,5,4,7],[0,0,0,0,1,4],[0,0,0,0,0,3],[0,0,0,0,0,0]])
print(M)
[[0 8 2 3 4 5]
[0 0 3 9 1 7]
[0 0 0 5 4 7]
[0 0 0 0 1 4]
[0 0 0 0 0 3]
[0 0 0 0 0 0]]
预期输出为:
[[0, 1],
[1, 3],
[2, 5]]
是沿相应列和行最大的值的坐标。
这是对角线为0的上对角矩阵。想法是使用np.amax
(more info here)沿每个轴计算矩阵最大值,并将转置矩阵与结果进行比较。
np.amax
与axis=0
将为您提供每一列的最大值,而np.amax
与axis=1
将为您提供每一行的最大值。
解决方案可能是:
c = np.amax(M,axis=0) #maximas along column axis
l = np.amax(M,axis=1) #maximas along row axis
#comparison with transposed matrix
maskC = np.asarray(M.transpose()>=c) #mask of valid values for column maximas
maskL = np.asarray(M.transpose()>=l) #mask of valid values for row maximas
mask=np.logical_and(maskC,maskL) # final mask
j,i = mask.nonzero() #keep only the coordinates where the mask is True
coordinates = np.stack([i,j],axis=1) #build an array with the resulting coordinates
这给出了:
array([[0, 1],
[1, 3],
[2, 5]])