[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