И NumPy вещания: вычисление суммы квадратов разностей между двумя массивами

У меня есть следующий код. Невозможно в Python. Должен быть способ перевести этот расчет в эфир...

def euclidean_square(a,b):
    squares = np.zeros((a.shape[0],b.shape[0]))
    for i in range(squares.shape[0]):
        for j in range(squares.shape[1]):
            diff = a[i,:] - b[j,:]
            sqr = diff**2.0
            squares[i,j] = np.sum(sqr)
    return squares

2 ответов


можно использовать np.einsum после вычисления различий в broadcasted way, вот так -

ab = a[:,None,:] - b
out = np.einsum('ijk,ijk->ij',ab,ab)

или использовать scipy's cdist с дополнительным аргументом метрики, установленным как 'sqeuclidean' чтобы дать нам квадратные евклидовы расстояния, необходимые для нашей проблемы, например -

from scipy.spatial.distance import cdist
out = cdist(a,b,'sqeuclidean')

другое решение, кроме использования cdist следующая

difference_squared = np.zeros((a.shape[0], b.shape[0]))
for dimension_iterator in range(a.shape[1]):
    difference_squared = difference_squared + np.subtract.outer(a[:, dimension_iterator], b[:, dimension_iterator])**2.