[Numpy-discussion] Optimizing speed for large-array inter-element algorithms (specifically, color space conversion)
Bruce Southey
bsouthey at gmail.com
Tue Jan 22 09:21:11 EST 2008
Hi,
Also try NumExpr (http://www.scipy.org/SciPyPackages/NumExpr):
"The scipy.sandbox.numexpr package supplies routines for the fast
evaluation of array expressions elementwise by using a vector-based
virtual machine. "
However, this page is probably a little out of date.
Regards
Bruce
On Jan 21, 2008 4:17 PM, Arnar Flatberg <arnar.flatberg at gmail.com> wrote:
> Hi Theodore
>
> Probably not the fastest, but a full example of how you may vectorize your loop.
> Ran just one test, and that speeded up the original code.
>
> Example:
> ----------------
>
> from numpy import empty_like
>
> def vectorized_rgb2hsv(im):
> "im is a (m, n, 3) array."""
> im = im/255.
> out = empty_like(im)
> im_max = im.max(-1)
> delta = im.ptp(-1)
> s = delta/im_max
> s[delta==0] = 0
> index = im[:,:,0] == im_max # red is max
> out[index, 0] = (im[index, 1] - im[index, 2] ) / delta[index]
> index = im[:,:,1] == im_max # green is max
> out[index, 0] = 2 + (im[index, 2] - im[index, 0] ) / delta[index]
> index = im[:,:,2] == im_max # blue is max
> out[index, 0] = 4 + (im[index, 0] - im[index, 1] ) / delta[index]
> out[:,:,0] = (out[:,:,0]/6.0) % 1.0
> out[:,:,1] = s
> out[:,:,2] = im_max
> out = (255.*out).astype(uint8)
> return out
>
>
> Timings (shape: 1202, 800, 3):
> -----------------
> code in first post:
> %prun a = rgb2hsv.rgb2hsv(s)
> 1923207 function calls in 18.423 CPU seconds
>
> removing loop:
> %prun b = rgb2hsv.vectorized_rgb2hsv(s)
> 8 function calls in 4.630 CPU seconds
>
>
> Arnar
>
> _______________________________________________
> Numpy-discussion mailing list
> Numpy-discussion at scipy.org
> http://projects.scipy.org/mailman/listinfo/numpy-discussion
>
More information about the NumPy-Discussion
mailing list