@@ -100,8 +100,9 @@ void wrap_exceptions()
100100// / helper for creating numpy array of doubles
101101NumPyArray_DoublePtr createNumPyDoubleArray (int dim, const int * sz)
102102{
103- boost::python::object rvobj = newNumPyArray (dim, sz, PyArray_DOUBLE);
104- double * rvdata = static_cast <double *>(PyArray_DATA (rvobj.ptr ()));
103+ boost::python::object rvobj = newNumPyArray (dim, sz, NPY_DOUBLE);
104+ PyArrayObject* a = reinterpret_cast <PyArrayObject*>(rvobj.ptr ());
105+ double * rvdata = static_cast <double *>(PyArray_DATA (a));
105106 NumPyArray_DoublePtr rv (rvobj, rvdata);
106107 return rv;
107108}
@@ -110,14 +111,15 @@ NumPyArray_DoublePtr createNumPyDoubleArray(int dim, const int* sz)
110111// / helper for creating numpy array of the same shape as the argument
111112NumPyArray_DoublePtr createNumPyDoubleArrayLike (boost::python::object& obj)
112113{
113- PyObject* arr = obj.ptr ();
114- int dim = PyArray_NDIM (arr);
115- npy_intp* shape = PyArray_DIMS (arr);
114+ assert (PyArray_Check (obj.ptr ()));
115+ PyArrayObject* a = reinterpret_cast <PyArrayObject*>(obj.ptr ());
116116 // create numpy array
117117 boost::python::object rvobj (
118118 boost::python::handle<>(
119- PyArray_SimpleNew (dim, shape, PyArray_DOUBLE)));
120- double * rvdata = static_cast <double *>(PyArray_DATA (rvobj.ptr ()));
119+ PyArray_NewLikeArray (
120+ a, NPY_CORDER, PyArray_DescrFromType (NPY_DOUBLE), 0 )));
121+ PyArrayObject* a1 = reinterpret_cast <PyArrayObject*>(rvobj.ptr ());
122+ double * rvdata = static_cast <double *>(PyArray_DATA (a1));
121123 NumPyArray_DoublePtr rv (rvobj, rvdata);
122124 return rv;
123125}
@@ -134,7 +136,7 @@ createNumPyDoubleView(double* data, int dim, const int* sz)
134136 copy (sz, sz + dim, npsz);
135137 python::object rv (
136138 python::handle<>(
137- PyArray_SimpleNewFromData (dim, npsz, PyArray_DOUBLE , data)));
139+ PyArray_SimpleNewFromData (dim, npsz, NPY_DOUBLE , data)));
138140 return rv;
139141}
140142
@@ -168,16 +170,16 @@ void assignR3Vector(
168170 // If value is numpy array, try direct data access
169171 if (PyArray_Check (value.ptr ()))
170172 {
171- PyObject* vobj = PyArray_ContiguousFromAny (
172- value.ptr (), PyArray_DOUBLE , 1 , 1 );
173- if (vobj && Ndim == PyArray_DIM (vobj , 0 ))
173+ PyArrayObject* a = reinterpret_cast <PyArrayObject*> (
174+ PyArray_ContiguousFromAny ( value.ptr (), NPY_DOUBLE , 1 , 1 ) );
175+ if (a && Ndim == PyArray_DIM (a , 0 ))
174176 {
175- double * p = static_cast <double *>(PyArray_DATA (vobj ));
177+ double * p = static_cast <double *>(PyArray_DATA (a ));
176178 std::copy (p, p + Ndim, dst.data ().begin ());
177- Py_DECREF (vobj );
179+ Py_DECREF (a );
178180 return ;
179181 }
180- Py_XDECREF (vobj );
182+ Py_XDECREF (a );
181183 }
182184 // handle scalar assignment
183185 python::extract<double > getvalue (value);
@@ -201,17 +203,16 @@ void assignR3Matrix(
201203 // If value is numpy array, try direct data access
202204 if (PyArray_Check (value.ptr ()))
203205 {
204- PyObject* vobj = PyArray_ContiguousFromAny (
205- value.ptr (), PyArray_DOUBLE, 2 , 2 );
206- if (vobj && Ndim == PyArray_DIM (vobj, 0 ) &&
207- Ndim == PyArray_DIM (vobj, 1 ))
206+ PyArrayObject* a = reinterpret_cast <PyArrayObject*>(
207+ PyArray_ContiguousFromAny (value.ptr (), NPY_DOUBLE, 2 , 2 ));
208+ if (a && Ndim == PyArray_DIM (a, 0 ) && Ndim == PyArray_DIM (a, 1 ))
208209 {
209- double * p = static_cast <double *>(PyArray_DATA (vobj ));
210+ double * p = static_cast <double *>(PyArray_DATA (a ));
210211 std::copy (p, p + Ndim * Ndim, dst.data ().begin ());
211- Py_DECREF (vobj );
212+ Py_DECREF (a );
212213 return ;
213214 }
214- Py_XDECREF (vobj );
215+ Py_XDECREF (a );
215216 }
216217 // handle scalar assignment
217218 python::extract<double > getvalue (value);
@@ -229,8 +230,9 @@ void assignR3Matrix(
229230// / helper for creating numpy array of integers
230231NumPyArray_IntPtr createNumPyIntArray (int dim, const int * sz)
231232{
232- boost::python::object rvobj = newNumPyArray (dim, sz, PyArray_INT);
233- int * rvdata = static_cast <int *>(PyArray_DATA (rvobj.ptr ()));
233+ boost::python::object rvobj = newNumPyArray (dim, sz, NPY_INT);
234+ PyArrayObject* a = reinterpret_cast <PyArrayObject*>(rvobj.ptr ());
235+ int * rvdata = static_cast <int *>(PyArray_DATA (a));
234236 NumPyArray_IntPtr rv (rvobj, rvdata);
235237 return rv;
236238}
@@ -248,15 +250,16 @@ extractQuantityType(
248250 python::extract<QuantityType&> getqt (obj);
249251 if (getqt.check ()) return getqt ();
250252 // copy data directly if it is a numpy array of doubles
251- PyObject* pobj = obj.ptr ();
252- bool isdoublenumpyarray = PyArray_Check (pobj) &&
253- (1 == PyArray_NDIM (pobj)) &&
254- (PyArray_DOUBLE == PyArray_TYPE (pobj));
253+ PyArrayObject* a = PyArray_Check (obj.ptr ()) ?
254+ reinterpret_cast <PyArrayObject*>(obj.ptr ()) : NULL ;
255+ bool isdoublenumpyarray = a &&
256+ (1 == PyArray_NDIM (a)) &&
257+ (NPY_DOUBLE == PyArray_TYPE (a));
255258 if (isdoublenumpyarray)
256259 {
257- double * src = static_cast <double *>(PyArray_DATA (pobj ));
258- npy_intp stride = PyArray_STRIDE (pobj , 0 ) / PyArray_ITEMSIZE (pobj );
259- rv.resize (PyArray_SIZE (pobj ));
260+ double * src = static_cast <double *>(PyArray_DATA (a ));
261+ npy_intp stride = PyArray_STRIDE (a , 0 ) / PyArray_ITEMSIZE (a );
262+ rv.resize (PyArray_SIZE (a ));
260263 QuantityType::iterator dst = rv.begin ();
261264 for (; dst != rv.end (); ++dst, src += stride) *dst = *src;
262265 return rv;
@@ -271,16 +274,17 @@ extractQuantityType(
271274// / efficient conversion of Python object to a numpy array of doubles
272275NumPyArray_DoublePtr extractNumPyDoubleArray (::boost::python::object& obj)
273276{
274- PyObject* arr = PyArray_ContiguousFromAny (obj.ptr (), PyArray_DOUBLE , 0 , 0 );
275- if (!arr )
277+ PyObject* pobj = PyArray_ContiguousFromAny (obj.ptr (), NPY_DOUBLE , 0 , 0 );
278+ if (!pobj )
276279 {
277280 const char * emsg = " Cannot convert this object to numpy array." ;
278281 PyErr_SetString (PyExc_TypeError, emsg);
279282 boost::python::throw_error_already_set ();
280283 abort ();
281284 }
282- boost::python::object rvobj ((boost::python::handle<>(arr)));
283- double * rvdata = static_cast <double *>(PyArray_DATA (arr));
285+ boost::python::object rvobj ((boost::python::handle<>(pobj)));
286+ PyArrayObject* a = reinterpret_cast <PyArrayObject*>(pobj);
287+ double * rvdata = static_cast <double *>(PyArray_DATA (a));
284288 NumPyArray_DoublePtr rv (rvobj, rvdata);
285289 return rv;
286290}
@@ -311,24 +315,23 @@ std::vector<int> extractintvector(boost::python::object obj)
311315 // iterable of integers
312316 if (isiterable (obj))
313317 {
314- PyObject* pobj = obj.ptr ();
318+ PyArrayObject* a = PyArray_Check (obj.ptr ()) ?
319+ reinterpret_cast <PyArrayObject*>(obj.ptr ()) : NULL ;
315320 // handle numpy array of integers
316- bool isintegernumpyarray = PyArray_Check (pobj) &&
317- (1 == PyArray_NDIM (pobj )) && PyArray_ISINTEGER (pobj );
321+ bool isintegernumpyarray =
322+ a && (1 == PyArray_NDIM (a )) && PyArray_ISINTEGER (a );
318323 if (isintegernumpyarray)
319324 {
320325 object aobj = obj;
321- if (PyArray_INT != PyArray_TYPE (pobj ))
326+ if (NPY_INT != PyArray_TYPE (a ))
322327 {
323- object a1 (handle<>(PyArray_Cast (
324- reinterpret_cast <PyArrayObject*>(pobj),
325- PyArray_INT)));
328+ object a1 (handle<>(PyArray_Cast (a, NPY_INT)));
326329 aobj = a1;
327330 }
328- PyObject* pa = aobj.ptr ();
329- assert (PyArray_INT == PyArray_TYPE (pa ));
330- int * pfirst = static_cast <int *>(PyArray_DATA (pa ));
331- int * plast = pfirst + PyArray_SIZE (pa );
331+ PyArrayObject* a1 = reinterpret_cast <PyArrayObject*>( aobj.ptr () );
332+ assert (NPY_INT == PyArray_TYPE (a1 ));
333+ int * pfirst = static_cast <int *>(PyArray_DATA (a1 ));
334+ int * plast = pfirst + PyArray_SIZE (a1 );
332335 rv.assign (pfirst, plast);
333336 return rv;
334337 }
0 commit comments