[pypy-svn] r76219 - pypy/branch/micronumpy/pypy/tool
dan at codespeak.net
dan at codespeak.net
Thu Jul 15 01:06:35 CEST 2010
Author: dan
Date: Thu Jul 15 01:06:33 2010
New Revision: 76219
Added:
pypy/branch/micronumpy/pypy/tool/numpybench.py
Log:
Ooops, forgot the benchmark. I want everything under control before merging trunk into here.
Added: pypy/branch/micronumpy/pypy/tool/numpybench.py
==============================================================================
--- (empty file)
+++ pypy/branch/micronumpy/pypy/tool/numpybench.py Thu Jul 15 01:06:33 2010
@@ -0,0 +1,54 @@
+from __future__ import division
+try:
+ import numpy as np
+except ImportError, e:
+ import micronumpy as np
+
+def naive_convolve(f, g):
+ # f is an image and is indexed by (v, w)
+ # g is a filter kernel and is indexed by (s, t),
+ # it needs odd dimensions
+ # h is the output image and is indexed by (x, y),
+ # it is not cropped
+ if g.shape[0] % 2 != 1 or g.shape[1] % 2 != 1:
+ raise ValueError("Only odd dimensions on filter supported")
+ # smid and tmid are number of pixels between the center pixel
+ # and the edge, ie for a 5x5 filter they will be 2.
+ #
+ # The output size is calculated by adding smid, tmid to each
+ # side of the dimensions of the input image.
+ vmax = f.shape[0]
+ wmax = f.shape[1]
+ smax = g.shape[0]
+ tmax = g.shape[1]
+ smid = smax // 2
+ tmid = tmax // 2
+ xmax = vmax + 2*smid
+ ymax = wmax + 2*tmid
+ # Allocate result image.
+ h = np.zeros([xmax, ymax], dtype=f.dtype)
+ # Do convolution
+ for x in range(xmax):
+ for y in range(ymax):
+ print "(%d, %d)" % (x, y)
+ # Calculate pixel value for h at (x,y). Sum one component
+ # for each pixel (s, t) of the filter g.
+ s_from = max(smid - x, -smid)
+ s_to = min((xmax - x) - smid, smid + 1)
+ t_from = max(tmid - y, -tmid)
+ t_to = min((ymax - y) - tmid, tmid + 1)
+ value = 0
+ for s in range(s_from, s_to):
+ for t in range(t_from, t_to):
+ v = x - smid + s
+ w = y - tmid + t
+ value += g[smid - s, tmid - t] * f[v, w]
+ h[x, y] = value
+ return h
+
+if __name__ == '__main__':
+ image = np.array([[x + y for x in range(200)] for y in range(200)])
+ kernel = np.array([[0, 1, 0],
+ [1, 1, 1],
+ [0, 1, 0]])
+ result = naive_convolve(image, kernel)
More information about the Pypy-commit
mailing list