Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

How to access data using raw pointers - Boost.Python NumPy extension 1.0 documentation

(NumPy)

How to access data using raw pointers

One of the advantages of the ndarray wrapper is that the same data can be used in both Python and C++ and changes can be made to reflect at both ends. The from_data method makes this possible.

Like before, first get the necessary headers, setup the namespaces and initialize the Python runtime and numpy module:

#include <boost/python/numpy.hpp>
#include <iostream>

namespace p = boost::python;
namespace np = boost::python::numpy;

int main(int argc, char **argv)
{
  Py_Initialize();
  np::initialize();

Create an array in C++ , and pass the pointer to it to the from_data method to create an ndarray:

int arr[] = {1,2,3,4,5};
np::ndarray py_array = np::from_data(arr, np::dtype::get_builtin<int>(),
                                     p::make_tuple(5),
                                     p::make_tuple(sizeof(int)),
                                     p::object());

Print the source C++ array, as well as the ndarray, to check if they are the same:

std::cout << "C++ array :" << std::endl;
for (int j=0;j<4;j++)
{
  std::cout << arr[j] << ' ';
}
std::cout << std::endl
          << "Python ndarray :" << p::extract<char const *>(p::str(py_array)) << std::endl;

Now, change an element in the Python ndarray, and check if the value changed correspondingly in the source C++ array:

py_array[1] = 5 ;
std::cout << "Is the change reflected in the C++ array used to create the ndarray ? " << std::endl;
for (int j = 0; j < 5; j++)
{
  std::cout << arr[j] << ' ';
}

Next, change an element of the source C++ array and see if it is reflected in the Python ndarray:

  arr[2] = 8;
  std::cout << std::endl
            << "Is the change reflected in the Python ndarray ?" << std::endl
            << p::extract<char const *>(p::str(py_array)) << std::endl;
}

As we can see, the changes are reflected across the ends. This happens because the from_data method passes the C++ array by reference to create the ndarray, and thus uses the same locations for storing data.