[Numpy-discussion] Re: STL wrapper for PyArrayObject

Phlip pplumlee at omnigon.com
Thu Jan 11 14:48:28 EST 2001


Proclaimed Chris Barker from the mountaintops:

> I waited a little while before answering this, because there are
> certainly people more qualified to do so that me. I am only on the NumPy
> list, so it may have been answered on a different list.

The irritation is, without a CXX list server, I'm having to molest the 
off-topic fora where Dubois et al are reputed to hang out.

> The short answer is yes, you will have to generate a new a array and
> copy the old one into the new. MultiArray objects were created to
> provide efficient storage of lots of numbers (among other things).
> Because of this requirement, the numbers are stored as a large single
> array, and so they cannot be re-sized without re-creating that array.
> You may be able to change just the data array itself (and a few
> properties), rather than creating a new structure entirely, but it
> probably wouldn't be worth it.

Here's the state of the system:


        static void
copyData (
        Py::Array & ma,
        vector<vector< string > > & database, 
        int maxFields
        )
{

#if 1

        Py::Sequence shape (Py::Int (2)); // <-- pow
        shape[0] = Py::Int (int (database.size()));
        shape[1] = Py::Int (maxFields);
        PyArray_Reshape ((PyArrayObject*)ma.ptr(), shape.ptr());

#else

        int zone[] = { database.size(), maxFields };
        Py::Object mo ((PyObject*)PyArray_FromDims
                                (2, zone, PyArray_OBJECT)
                        );
        ma = mo;

        assert (ma.dimension(1) == database.size());
        assert (ma.dimension(2) == maxFields);

        for (int idxRow (0);  idxRow < maxRows;  ++idxRow)
        {
                Py::Array row (ma[idxRow]);

                for (int idxCol (0);  idxCol < maxFields;  ++idxCol)
                {
                        string const & str (database[idxRow][idxCol]);
                        Py::String     pyStr (str.c_str());
                        Py::Object     obj (pyStr);

                        row [idxCol] = obj;  //  <-- pow
                }
        }

#endif

}

Both versions crash on the line marked "pow".

The top one crashes when I think I'm trying to do the equivalent of the Python

	array = (2.4)

The bottom one crashes after creating a new array, right when I try to copy 
in an element. The Pythonic equivalent of 

	matrixi [row][col] = "8"

Everyone remember I'm not trying to presenve the old contents of the array - 
just return from the extension a new array full of stuff.

> By the way, I'd like to hear how this all works out. Being able to use
> NumPy Arrays in extensions more easily would be great!

Our Chief Drive-by Architect has ordered me to use them like an in-memory 
database. >Sigh<

--Phlip
"...fanatical devotion to the Pope, and cute red uniforms..."





More information about the NumPy-Discussion mailing list