从矩阵的上三角获取索引

5
我有一个表示为numpy数组的对称矩阵,如下面的示例:
 [[ 1.          0.01735908  0.01628629  0.0183845   0.01678901  0.00990739 0.03326491  0.0167446 ]
 [ 0.01735908  1.          0.0213712   0.02364181  0.02603567  0.01807505 0.0130358   0.0107082 ]
 [ 0.01628629  0.0213712   1.          0.01293289  0.02041379  0.01791615 0.00991932  0.01632739]
 [ 0.0183845   0.02364181  0.01293289  1.          0.02429031  0.01190878 0.02007371  0.01399866]
 [ 0.01678901  0.02603567  0.02041379  0.02429031  1.          0.01496896 0.00924174  0.00698689]
 [ 0.00990739  0.01807505  0.01791615  0.01190878  0.01496896  1.         0.0110924   0.01514519]
 [ 0.03326491  0.0130358   0.00991932  0.02007371  0.00924174  0.0110924  1.          0.00808803]
 [ 0.0167446   0.0107082   0.01632739  0.01399866  0.00698689  0.01514519 0.00808803  1.        ]]
我需要找到最大值的索引(行和列),而不考虑对角线。由于它是对称矩阵,因此我只考虑了矩阵的上三角部分。
ind = np.triu_indices(M_size, 1)

然后是最大值的索引

max_ind = np.argmax(H[ind])

然而max_ind是在使用triu_indices获取上三角向量后的索引,我该如何知道我刚找到的值所在的行和列呢?
矩阵可以是任意大小,但它总是对称的。你知道一个更好的方法来实现相同的效果吗? 谢谢。
3个回答

8

你是否可以通过使用np.triu返回一个将矩阵除了上三角以外的部分都归零的副本,然后只需使用np.argmax和np.unravel_index获取行/列索引呢?

例如:

x = np.zeros((10,10))
x[3, 8] = 1
upper = np.triu(x, 1)
idx = np.argmax(upper)
row, col = np.unravel_index(idx, upper.shape)

这种方法的缺点是会创建输入矩阵的副本,但它仍然比在Python中遍历元素要快得多。 它还假定上三角中的最大值 > 0。

哇,我发现这是更优雅的方式来完成它。谢谢! - Jorge Zapata
1
谢谢,但说实话,如果我要选择的话,我可能会选择@Bonlenfum的解决方案——它不涉及创建数组的中间副本,并且没有上三角中最大值必须为正数的限制。 - ali_m

5
您可以使用max_ind的值作为ind数据的索引。
max_ind = np.argmax(H[ind])
Out: 23

ind[0][max_ind], ind[1][max_ind],
Out: (4, 6)

通过查找整个矩阵中的最大值进行验证(不总是有效--取决于数据):

np.unravel_index(np.argmax(H), H.shape)
Out: (4, 6)

1

可能有一种更简洁的“numpy方式”来完成这个任务,但这是我首先想到的方法:

answer = None
biggest = 0
for r,row in enumerate(matrix):
    i,elem = max(enumerate(row[r+1:]), key=operator.itemgetter(1))
    if elem > biggest:
        biggest, answre = elem, i

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接