Change numeric demo to numpy demo using new features, update setup.py.
authorRobert Bradshaw <robertwb@math.washington.edu>
Fri, 10 Dec 2010 23:15:44 +0000 (15:15 -0800)
committerRobert Bradshaw <robertwb@math.washington.edu>
Fri, 10 Dec 2010 23:15:44 +0000 (15:15 -0800)
Demos/numeric_demo.pyx [deleted file]
Demos/numpy_demo.pyx [new file with mode: 0644]
Demos/setup.py

diff --git a/Demos/numeric_demo.pyx b/Demos/numeric_demo.pyx
deleted file mode 100644 (file)
index 3a20fd9..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-#
-#  This example demonstrates how to access the internals
-#  of a Numeric array object.
-#
-
-cdef extern from "Numeric/arrayobject.h":
-
-  struct PyArray_Descr:
-    int type_num, elsize
-    char type
-
-  ctypedef class Numeric.ArrayType [object PyArrayObject]:
-    cdef char *data
-    cdef int nd
-    cdef int *dimensions, *strides
-    cdef object base
-    cdef PyArray_Descr *descr
-    cdef int flags
-
-def print_2d_array(ArrayType a):
-  print "Type:", chr(a.descr.type)
-  if chr(a.descr.type) <> "f":
-    raise TypeError("Float array required")
-  if a.nd <> 2:
-    raise ValueError("2 dimensional array required")
-  cdef int nrows, ncols
-  cdef float *elems, x
-  nrows = a.dimensions[0]
-  ncols = a.dimensions[1]
-  elems = <float *>a.data
-  hyphen = "-"
-  divider = ("+" + 10 * hyphen) * ncols + "+"
-  print divider
-  for row in range(nrows):
-    for col in range(ncols):
-      x = elems[row * ncols + col]
-      print "| %8f" % x,
-    print "|"
-    print divider
diff --git a/Demos/numpy_demo.pyx b/Demos/numpy_demo.pyx
new file mode 100644 (file)
index 0000000..914cd03
--- /dev/null
@@ -0,0 +1,9 @@
+cimport numpy
+import numpy
+
+def sum_of_squares(numpy.ndarray[double, ndim=1] arr):
+    cdef long N = arr.shape[0]
+    cdef double ss = 0
+    for i in range(N):
+        ss += arr[i]**2
+    return ss
index 60cbeb817a1bec070cdafdecae6c1c422e6c5c81..4e5926507fb4405128d7f0ebc6d690fa4e377e94 100644 (file)
@@ -1,26 +1,23 @@
-import glob
+# Run as:
+#    python setup.py build_ext --inplace
 
 from distutils.core import setup
 from distutils.extension import Extension
-from Cython.Distutils import build_ext
+from Cython.Build import cythonize
 
+ext_modules = cythonize("*.pyx", exclude="numpy_*.pyx")
+
+# Only compile the following if numpy is installed.
 try:
     from numpy.distutils.misc_util import get_numpy_include_dirs
-    numpy_include_dirs = get_numpy_include_dirs()
-except:
-    numpy_include_dirs = []
-
-ext_modules=[ 
-    Extension("primes",       ["primes.pyx"]),
-    Extension("spam",         ["spam.pyx"]),
-]
-
-for file in glob.glob("*.pyx"):
-    if file != "numeric_demo.pyx":
-        ext_modules.append(Extension(file[:-4], [file], include_dirs = numpy_include_dirs))
+    numpy_demo = Extension("*",
+                           ["numpy_*.pyx"],
+                           include_dirs=get_numpy_include_dirs())
+    ext_modules.extend(cythonize(numpy_demo))
+except ImportError:
+    pass
 
 setup(
   name = 'Demos',
-  cmdclass = {'build_ext': build_ext},
   ext_modules = ext_modules,
 )