given an np.array of shape (n_days, n_lat, n_lon), I'd like to compute a histogram with fixed bins for each lat-lon cell (ie the distribution of daily values).
A simple solution to the problem is to loop over the cells and invoke np.histogram for each cell::
bins = np.linspace(0, 1.0, 10)
B = np.rand(n_days, n_lat, n_lon)
H = np.zeros((n_bins, n_lat, n_lon), dtype=np.int32)
for lat in range(n_lat):
for lon in range(n_lon):
H[:, lat, lon] = np.histogram(A[:, lat, lon], bins=bins)[0]
# note: code not tested
but this is quite slow. Is there a more efficient solution that does not involve a loop?
I looked into np.searchsorted to get the bin indices for each value in B and then use fancy indexing to update H::
bin_indices = bins.searchsorted(B)
H[bin_indices.ravel(), idx[0], idx[1]] += 1 # where idx is a index grid given by np.indices
# note: code not tested
but this does not work because the in-place add operator (+=) doesn't seem to support multiple updates of the same cell.
thx, Peter
a[idx] += 1would not be the same asa[idx] = a[idx] + 1.np.histogram2dwith theweightskeyword argument.weights? I don't want to do a 2d histogram.np.histogramddfunction.