И 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.