$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Sebastien Fortier (sebastien.fortier_at_[hidden])
Date: 2006-06-28 08:10:11
I'm having some problems with the use of multi_array's with python. What 
I'm trying to do is to export some functions that create multi_array's 
and pass these multi_array's to other functions that will extract other 
array's from them and display them.
Lets say I have this as an example.
//ArrayRef2D.h  typedef for a 2D multi_array of doubles
#ifndef ARRAYREF2D_H_
#define ARRAYREF2D_H_
#include <boost/multi_array.hpp>
typedef boost::const_multi_array_ref < double, 2 > 
const_array_type2D_ref_d_t;
typedef boost::multi_array < double, 2 > array_type2D_d_t;
#endif /*ARRAYREF2D_H_*/
//Fstd.h 2D multi_array generator
#ifndef FSTD_H_
#define FSTD_H_
#include "ArrayRef2D.h"
#include <string>
using namespace std;
class Fstd
{
public:
    Fstd(string filename) : filename_(filename){}
    array_type2D_d_t get2Dfield()
    {
        array_type2D_d_t matrix(boost::extents[2][2]);
        matrix[0][0] = 0;
        matrix[0][1] = -1;
        matrix[1][0] = 20;
        matrix[1][1] = -30;
        return matrix;
    }
private:
    string filename_;
};
#endif /*FSTD_H_*/
//MatrixAlgorithm2D.h provides methods for displaying and manipulating 
matrices
#ifndef MATRIXALGORITHM2D_H_
#define MATRIXALGORITHM2D_H_
#include "ArrayRef2D.h"
#include <cassert>
#include <cmath>
#include <iostream>
using namespace std;
class MatrixAlgorithm2D {
public:
    static array_type2D_d_t windChill(const_array_type2D_ref_d_t TT, 
const_array_type2D_ref_d_t UV)
    {
        assert((TT.shape()[0] == UV.shape()[0]) && (TT.shape()[1] == 
UV.shape()[1]));
        array_type2D_d_t RE(boost::extents[TT.shape()[0]][TT.shape()[1]]);
        for (unsigned int x = 0; x < TT.shape()[0]; x++) {
            for (unsigned int y = 0; y < TT.shape()[1]; y++) {
                if ((TT[x][y] <= 0.0) && (UV[x][y] >= 5.0)) {
                    RE[x][y] = ( 13.1200 + 0.6215 * (TT[x][y]) + (0.3965 
* (TT[x][y]) - 11.3700) * (pow((UV[x][y]),0.16)));
                } else {
                    RE[x][y] = (TT[x][y]);
                }
            }
        }
        return RE;
    }
   
    static void display_d(const_array_type2D_ref_d_t a)
    {
        for (unsigned int x = 0; x < a.shape()[0]; x++) {
            for (unsigned int y = 0; y < a.shape()[1]; y++) {
                cout << a[x][y];
                if(y < a.shape()[1] - 1) {
                    cout << ", ";
                }
            }
            cout<<endl;
        }
    }
      
};   
#endif /*MATRIXALGORITHM2D_H_*/
//matrix.cpp boost.python interface file generated with pyste
// Boost Includes 
==============================================================
#include "boost/python.hpp"
#include "boost/cstdint.hpp"
// Includes 
====================================================================
#include "Fstd.h"
#include "MatrixAlgorithm2D.h"
// Using 
=======================================================================
using namespace boost::python;
// Module 
======================================================================
BOOST_PYTHON_MODULE(matrix)
{
    class_< Fstd >("Fstd", init< const Fstd& >())
        .def(init< std::string >())
        .def("get2Dfield", &Fstd::get2Dfield)
    ;
    class_< MatrixAlgorithm2D >("MatrixAlgorithm2D", init<  >())
        .def(init< const MatrixAlgorithm2D& >())
        .def("windChill", &MatrixAlgorithm2D::windChill)
        .def("display_d", &MatrixAlgorithm2D::display_d)
        .staticmethod("windChill")
        .staticmethod("display_d")
    ;
}
I generated my so file with bjam and then
Python 2.3.5 (#2, Sep  4 2005, 22:01:42)
[GCC 3.3.5 (Debian 1:3.3.5-13)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
 >>> import matrix
 >>> dir(matrix)
['Fstd', 'MatrixAlgorithm2D', '__doc__', '__file__', '__name__']
 >>> m = matrix.Fstd("HELLO")
 >>> l = m.get2Dfield()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: No to_python (by-value) converter found for C++ type: 
boost::multi_array<double, 2, std::allocator<double> >
So you see I can't use my code, what am I doing wrong?
I would have liked to declare 2 arrays with get2Dfield() and pass these 
array to my windChill function to get another 2d matrix which I could 
then display with my display_d function.
-- Sébastien Fortier