我有一个对称矩阵表示为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 获取上三角形后得到的向量的索引,我如何知道值的行和列是哪个?刚发现?
矩阵可以是任何大小,但它总是对称的。你知道更好的方法吗? 谢谢
答案 0 :(得分:6)
你不能通过使用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
答案 1 :(得分:4)
您可以使用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)
答案 2 :(得分: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