[Numpy-discussion] efficient 3d histogram creation

josef.pktd@gmai... josef.pktd@gmai...
Mon May 4 06:00:13 CDT 2009


On Mon, May 4, 2009 at 12:31 AM, Chris Colbert <sccolbert@gmail.com> wrote:
> this actually sort of worked. Thanks for putting me on the right track.
>
> Here is what I ended up with.
>
> this is what I ended up with:
>
> def hist3d(imgarray):
>     histarray = N.zeros((16, 16, 16))
>     temp = imgarray.copy()
>     bins = N.arange(0, 257, 16)
>     histarray = N.histogramdd((temp[:,:,0].ravel(), temp[:,:,1].ravel(),
> temp[:,:,2].ravel()), bins=(bins, bins, bins))[0]
>     return histarray
>
> this creates a 3d histogram of rgb image values in the range 0,255 using 16
> bins per component color.
>
> on a 640x480 image, it executes in 0.3 seconds vs 4.5 seconds for a for
> loop.
>
> not quite framerate, but good enough for prototyping.
>

I don't think your copy to temp is necessary, and use reshape(-1,3) as
in the example of Stefan, which will avoid copying the array 3 times.

If you need to gain some more speed, then rewriting histogramdd and
removing some of the unnecessary checks and calculations looks
possible.
Josef


More information about the Numpy-discussion mailing list