Быстрый способ разделить записи матрицы K_ij на K_ii * K_jj на Python - PullRequest
2 голосов
/ 02 марта 2020

В Python у меня есть матрица K размеров (N x N). Я хочу нормализовать K путем деления каждой записи K_ij на sqrt (K_ (i, i) * K_ (j, j)). Какой быстрый способ достичь этого в Python без повторения каждой записи?

Мое текущее решение:

import numpy as np
K = np.random.rand(3,3)
diag = np.diag(K)
for i in range(np.shape(K)[0]):
    for j in range(np.shape(K)[1]):
        K[i,j] = K[i,j]/np.sqrt(diag[i]*diag[j])

1 Ответ

3 голосов
/ 02 марта 2020

Конечно, вам нужно перебирать каждую запись, по крайней мере, внутри. Для квадратных матриц:

K / np.sqrt(np.einsum('ii,jj->ij', K, K))

Если матрица не квадратная, сначала необходимо определить, что должно заменить «пропущенные» значения K[i,i], где i > j et c.

Альтернатива: используйте numba, чтобы оставить свой l oop как есть, получить бесплатное ускорение и даже избежать промежуточного распределения:

@njit
def normalize(K):
    M = np.empty_like(K)
    m, n = K.shape
    for i in range(m):
        Kii = K[i,i]
        for j in range(n):
            Kjj = K[j,j]
            M[i,j] = K[i,j] / np.sqrt(Kii * Kjj)
    return M
...