Search code examples
numpyarray-broadcasting

Vectorizing np.minimum & np.minimum over axes with broadcasting


I've roughly got something like

A = np.random.random([n, 2])
B = np.random.random([3, 2])
...
ret = 0
for b in B:
    for a in A:
        start = np.max([a[0], b[0]])
        end = np.min([a[1], b[1]])
        ret += np.max([0, end - start])
return ret

Putting it into words, A is an input array of n 2D intervals and B is a known array of 2D intervals, and I'm trying to compute the length of total intersection between all intervals.

Is there a way to vectorize it? My first though was using the np.maximize and np.minimize along with broadcasting, but nothing seems to work.


Solution

  • Broadcast after extending dimensions to vectorize things -

    p1 = np.maximum(A[:,None,0],B[:,0])
    p2 = np.minimum(A[:,None,1],B[:,1])
    ret = np.maximum(0,p2-p1).sum()