Skip to content

Commit

Permalink
Update docs/src/tutorial/numpy.rst
Browse files Browse the repository at this point in the history
  • Loading branch information
macdentalr12 committed Mar 27, 2012
1 parent 2e13048 commit ec49ce2
Showing 1 changed file with 38 additions and 0 deletions.
38 changes: 38 additions & 0 deletions docs/src/tutorial/numpy.rst
Expand Up @@ -311,3 +311,41 @@ compile-time if the type is set to :obj:`np.ndarray`, specifically it is
assumed that the data is stored in pure strided more and not in indirect
mode).

Pass data from a C function via pointer
==================


Since use of pointers in C is ubiquitous, here we give a quick example of how
to call C functions whose arguments contain pointers. Suppose you want to
manage an array (allocate and deallocate) with NumPy, but its data are
computed by an external C function declared in :file:`C_func_file.h`::
void C_func(double * CPointer, unsigned int N);

where CPointer points to the array and N is its size.

You can call the function in a Cython file in the following way::

cdef extern from "C_func_file.h":
void C_func(double *, unsigned int)

import cython
import numpy as np
cimport numpy as np
def f(arr): # 'arr' is a one-dimensional array of size N
# Before calling the external function, we need to check whether the
# memory for 'arr' is contiguous or not; if not, we store the computed
# data in an contiguous array and then copy the data from that array.
np.ndarray[np.double_t, ndim=1, mode="c"] contig_arr
if arr.flags.c_contiguous:
contig_arr = arr
else:
contig_arr = arr.copy('C')
C_func(<cython.double *> contig_arr.data, contig_arr.size)
if contig_arr is not arr:
arr[...] = contig_arr
return

This way, you can have access the function more or less as a regular
Python function while its data and associated memory gracefully managed
by NumPy.

0 comments on commit ec49ce2

Please sign in to comment.