Numpy sum of minimums of two arrays like dot product efficiently

I would like get two arrays' sum of minumums efficiently with numpy. For example;

X=np.array([[1,2,3],[1,2,0]])
Y=np.array([[0,2,0],[1,3,1]])

My result should be;

result = array([[2, 4],[2, 3]])

The calculation for first cell;

result[0,0] = min(X[0,0],Y[0,0])+ min(X[0,1],Y[0,1])+min(X[0,2],Y[0,2])

In general, the result should be:

res[i,j] = sum(np.minimum(X[i, :], Y[j, :]))

but looking for fastest way.


Solution 1:

dot is the equivalent of taking outer products, and summing on the appropriate axis.

The equivalent in your case is:

In [291]: np.minimum(X[:,None,:], Y[None,:,:])
Out[291]: 
array([[[0, 2, 0],
        [1, 2, 1]],

       [[0, 2, 0],
        [1, 2, 0]]])
In [292]: np.sum(np.minimum(X[:,None,:], Y[None,:,:]),axis=-1)
Out[292]: 
array([[2, 4],
       [2, 3]])