[C++-sig] Writing to numpy array: good practices?
Jonas Einarsson
jonas.einarsson at gmail.com
Tue Oct 11 16:39:58 CEST 2011
Dear list,
First, sorry if this is a double-post, I got confused with the subscription.
Anyhow, I seek an opinion on good practice.
I'd like to write simple programs that
1) (In Python) allocates numpy array,
2) (In C/C++) fills said numpy array with data.
To this end I use Boost.Python to compile an extension module. I use the
(possibly obsolete?) boost/python/numeric.hpp to allow passing an ndarray to
my C-functions. Then I use the numpy C API directly to extract a pointer to
the underlying data.
This seemingly works very well, and I can check for correct dimensions and
data types, etcetera.
As documentation is scarce, I ask you if this is an acceptable procedure?
Any pitfalls nearby?
Sample code: C++
void fill_array(numeric::array& y)
{
const int ndims = 2;
// Get pointer to np array
PyArrayObject* a = (PyArrayObject*)PyArray_FROM_O(y.ptr());
if (a == NULL) {
throw std::exception("Could not get NP array.");
}
if (a->descr->elsize != sizeof(double))
{
throw std::exception("Must be double ndarray");
}
if (a->nd != ndims)
{
throw std::exception("Wrong dimension on array.");
}
int rows = *(a->dimensions);
int cols = *(a->dimensions+1);
double* data = (double*)a->data;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
*(data + i*cols + j) = really_cool_function(i,j);
}
}
}
BOOST_PYTHON_MODULE(Practical01)
{
import_array();
boost::python::numeric::array::set_module_and_type("numpy", "ndarray");
def("fill_array",&fill_array);
}
And in python this could be used such as:
import Practical01
import numpy
import matplotlib.pyplot as plt
import matplotlib.cm as colormaps
import time
w=500
h=500
large_array = numpy.ones( (h,w) );
t1 = time.time()
Practical01.fill_array(large_array)
t2 = time.time()
print 'Horrible calculation took %0.3f ms' % ((t2-t1)*1000.0)
plt.imshow(large_array,cmap=colormaps.gray)
plt.show()
Simplicity is a major factor for me. I don't want a complete wrapper for
ndarrays, I just want to compute and shuffle data to Python for further
processing. Letting Python handle allocation and garbage collection also
seems like a good idea.
Sincerely,
Jonas Einarsson
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20111011/9928227a/attachment.html>
More information about the Cplusplus-sig
mailing list