#python #numpy #matrix
#python #numpy #матрица
Вопрос:
У меня есть два набора матриц Sigma и Sigma_barre (размер: KxDxD), и я пытаюсь вычислить матрицу расстояния Фробениуса (2-норма по матрице) между этими двумя наборами, то есть матрицу M (размер KxK), такую, что
M[ i, j] = расстояние между Sigma[ i] и Sigma_barre[ j]
Я использовал np.linalg.norm, но я не уверен на сто процентов, что он делает то, что я хочу. Вот мой наивный код :
M = np.zeros((K,K))
for i in range(K):
for j in range(K):
M[i,j] = np.linalg.norm(sigma[i]-sigma_barre[j])
Итак, мой вопрос: знаете ли вы элегантный / эффективный способ вычисления этой матрицы?
Комментарии:
1. Измените форму как в 2D, так и используйте
cdist
:cdist(sigma.reshape(sigma.shape[0],-1),sigma_barre.reshape(sigma_barre.shape[0],-1))
.
Ответ №1:
Вы можете сделать это за один раз, добавив несколько фиктивных измерений и указав, по какой оси следует производить суммирование.
M = np.linalg.norm(sigma[:,None] - sigma_barre[None,:], axis=(2,3))
Поскольку sigma[:,None] - sigma_barre[None,:]
это матрица размером KxKxDxD, это может занимать много памяти в зависимости от того, насколько велики K и D. Если проблема с памятью, ваше решение кажется хорошим, хотя вы можете j
начать цикл с i 1
вместо этого, поскольку вы знаете это M[i,j] == M[j,i]
и это M[i,i] == 0
.