In [ ]:
import numpy as np

In [4]:
def fastmultihist(sample, bins):
    N, D = sample.shape
    # Compute the bin number each sample falls into.
    Ncount = {}
    for i in arange(D):
        Ncount[i] = np.digitize(sample[:, i], bins[i])

    for i in arange(D):
        nbin[i] = len(bins[i]) - 1
        
    xy = zeros(N, int)
    for i in arange(0, D-1):
        xy += Ncount[ni[i]] * nbin[ni[i+1:]].prod()
    xy += Ncount[ni[-1]]
    
    hist = zeros(nbin, float).reshape(-1)
    flatcount = bincount(xy, weights)
    a = arange(len(flatcount))
    hist[a] = flatcount
    
    hist = hist.reshape(nbin)

In [ ]: