脾气暴躁:在二维矩阵的两个轴上找到唯一的最大值

时间:2019-04-18 08:39:48

标签: algorithm python-2.7 numpy matrix

给出一个n×n方阵M的方法,该如何有效地找到所有(i,j)0 <= i,j < n没有k的地方, 0 <= k < n这样:

  1. M[i,j] < M[k,j]
  2. M[i,j] < M[i,k]
  3. M[i,j] < M[j,k]
  4. 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])

但是它看起来很混乱,所以我不信任它。我也希望有一个更优雅的解决方案。

1 个答案:

答案 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.amaxmore info here)沿每个轴计算矩阵最大值,并将转置矩阵与结果进行比较。 np.amaxaxis=0将为您提供每一列的最大值,而np.amaxaxis=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]])