NumPy Broadcasting: Cálculo de la sum de las diferencias cuadradas entre dos matrices

tengo el siguiente código. Se está tomando para siempre en Python. Debe haber una manera de traducir este cálculo en una transmisión …

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 

Puede usar np.einsum después de calcular las diferencias de forma broadcasted way , de esta manera:

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

O use el scipy's cdist con su argumento métrico opcional establecido como 'sqeuclidean' para darnos las distancias euclidianas cuadradas según sea necesario para nuestro problema, como tal:

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

Otra solución además de usar cdist es la siguiente

 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.