[Numpy-discussion] efficient 3d histogram creation
josef.pktd at gmail.com
josef.pktd at gmail.com
Sun May 3 20:36:09 EDT 2009
On Sun, May 3, 2009 at 8:15 PM, Chris Colbert <sccolbert at gmail.com> wrote:
> in my endless pursuit of perfomance, i'm searching for a quick way to create
> a 3d histogram from a 3d rgb image.
>
> Here is what I have so far for a (16,16,16) 3d histogram:
>
> def hist3d(imgarray):
> histarray = N.zeros((16, 16, 16))
> temp = imgarray.copy()
> (i, j) = imgarray.shape[0:2]
> temp = (temp - temp % 16) / 16
> for a in range(i):
> for b in range(j):
> (b1, b2, b3) = temp[a, b, :]
> histarray[b1, b2, b3] += 1
> return histarray
>
> this works, but takes about 4 seconds for a 640x480 image.
>
> I tried doing the inverse of my previous post, namely replacing the nested
> for loop with:
> histarray[temp[:,:,0], temp[:,:,1], temp[:,:,2]] += 1
>
>
> but that doesn't work for whatever reason. It gives me number, but they're
> incorrect.
>
> Any ideas?
I'm not sure what exactly you need, but did you look at np.histogramdd ?
reading the help file, this might work
numpy.histogramdd(temp[:,:,0].ravel(), temp[:,:,1].ravel(),
temp[:,:,2].ravel(), bins=16)
but I never used histogramdd.
also looking at the source of numpy is often very instructive, lots of
good tricks to find in there: np.source(np.histogramdd).
Josef
More information about the NumPy-Discussion
mailing list