zorro
zorro

Reputation: 117

Sum of squared differences - NumPy/Python

I have these 2 vectors A and B:

import numpy as np
A=np.array([1,2,3])
B=np.array([8,7])

and I want to add them up with this expression:

Result = sum((A-B)**2)

The expected result that I need is:

Result = np.array([X,Y])

Where:

X = (1-8)**2 + (2-8)**2 + (3-8)**2 = 110
Y = (1-7)**2 + (2-7)**2 + (3-7)**2 = 77

How can I do it? The 2 arrays are an example, in my case I have a very large arrays and I cannot do it manually.

Upvotes: 2

Views: 4112

Answers (2)

Divakar
Divakar

Reputation: 221564

Since you have mentioned that you are working with large arrays, with focus on performance here's one with np.einsum that does the combined operation of squaring and sum-reduction in one step efficiently, like so -

def einsum_based(A,B):
    subs = A[:,None] - B
    return np.einsum('ij,ij->j',subs, subs)

Sample run -

In [16]: A = np.array([1,2,3])
    ...: B = np.array([8,7])
    ...: 

In [17]: einsum_based(A,B)
Out[17]: array([110,  77])

Runtime test with large arrays scaling up the given sample 1000x -

In [8]: A = np.random.rand(3000)

In [9]: B = np.random.rand(2000)

In [10]: %timeit ((A[:, None] - B) ** 2).sum(0) # @Psidom's soln
10 loops, best of 3: 21 ms per loop

In [11]: %timeit einsum_based(A,B)
100 loops, best of 3: 12.3 ms per loop

Upvotes: 1

akuiper
akuiper

Reputation: 214957

You can make A a 2d array and utilize numpy's broadcasting property to vectorize the calculation:

((A[:, None] - B) ** 2).sum(0)
# array([110,  77])

Upvotes: 5

Related Questions