@@ -100,8 +100,9 @@ void wrap_exceptions()
100
100
// / helper for creating numpy array of doubles
101
101
NumPyArray_DoublePtr createNumPyDoubleArray (int dim, const int * sz)
102
102
{
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));
105
106
NumPyArray_DoublePtr rv (rvobj, rvdata);
106
107
return rv;
107
108
}
@@ -110,14 +111,15 @@ NumPyArray_DoublePtr createNumPyDoubleArray(int dim, const int* sz)
110
111
// / helper for creating numpy array of the same shape as the argument
111
112
NumPyArray_DoublePtr createNumPyDoubleArrayLike (boost::python::object& obj)
112
113
{
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 ());
116
116
// create numpy array
117
117
boost::python::object rvobj (
118
118
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));
121
123
NumPyArray_DoublePtr rv (rvobj, rvdata);
122
124
return rv;
123
125
}
@@ -134,7 +136,7 @@ createNumPyDoubleView(double* data, int dim, const int* sz)
134
136
copy (sz, sz + dim, npsz);
135
137
python::object rv (
136
138
python::handle<>(
137
- PyArray_SimpleNewFromData (dim, npsz, PyArray_DOUBLE , data)));
139
+ PyArray_SimpleNewFromData (dim, npsz, NPY_DOUBLE , data)));
138
140
return rv;
139
141
}
140
142
@@ -168,16 +170,16 @@ void assignR3Vector(
168
170
// If value is numpy array, try direct data access
169
171
if (PyArray_Check (value.ptr ()))
170
172
{
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 ))
174
176
{
175
- double * p = static_cast <double *>(PyArray_DATA (vobj ));
177
+ double * p = static_cast <double *>(PyArray_DATA (a ));
176
178
std::copy (p, p + Ndim, dst.data ().begin ());
177
- Py_DECREF (vobj );
179
+ Py_DECREF (a );
178
180
return ;
179
181
}
180
- Py_XDECREF (vobj );
182
+ Py_XDECREF (a );
181
183
}
182
184
// handle scalar assignment
183
185
python::extract<double > getvalue (value);
@@ -201,17 +203,16 @@ void assignR3Matrix(
201
203
// If value is numpy array, try direct data access
202
204
if (PyArray_Check (value.ptr ()))
203
205
{
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 ))
208
209
{
209
- double * p = static_cast <double *>(PyArray_DATA (vobj ));
210
+ double * p = static_cast <double *>(PyArray_DATA (a ));
210
211
std::copy (p, p + Ndim * Ndim, dst.data ().begin ());
211
- Py_DECREF (vobj );
212
+ Py_DECREF (a );
212
213
return ;
213
214
}
214
- Py_XDECREF (vobj );
215
+ Py_XDECREF (a );
215
216
}
216
217
// handle scalar assignment
217
218
python::extract<double > getvalue (value);
@@ -229,8 +230,9 @@ void assignR3Matrix(
229
230
// / helper for creating numpy array of integers
230
231
NumPyArray_IntPtr createNumPyIntArray (int dim, const int * sz)
231
232
{
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));
234
236
NumPyArray_IntPtr rv (rvobj, rvdata);
235
237
return rv;
236
238
}
@@ -248,15 +250,16 @@ extractQuantityType(
248
250
python::extract<QuantityType&> getqt (obj);
249
251
if (getqt.check ()) return getqt ();
250
252
// 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));
255
258
if (isdoublenumpyarray)
256
259
{
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 ));
260
263
QuantityType::iterator dst = rv.begin ();
261
264
for (; dst != rv.end (); ++dst, src += stride) *dst = *src;
262
265
return rv;
@@ -271,16 +274,17 @@ extractQuantityType(
271
274
// / efficient conversion of Python object to a numpy array of doubles
272
275
NumPyArray_DoublePtr extractNumPyDoubleArray (::boost::python::object& obj)
273
276
{
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 )
276
279
{
277
280
const char * emsg = " Cannot convert this object to numpy array." ;
278
281
PyErr_SetString (PyExc_TypeError, emsg);
279
282
boost::python::throw_error_already_set ();
280
283
abort ();
281
284
}
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));
284
288
NumPyArray_DoublePtr rv (rvobj, rvdata);
285
289
return rv;
286
290
}
@@ -311,24 +315,23 @@ std::vector<int> extractintvector(boost::python::object obj)
311
315
// iterable of integers
312
316
if (isiterable (obj))
313
317
{
314
- PyObject* pobj = obj.ptr ();
318
+ PyArrayObject* a = PyArray_Check (obj.ptr ()) ?
319
+ reinterpret_cast <PyArrayObject*>(obj.ptr ()) : NULL ;
315
320
// 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 );
318
323
if (isintegernumpyarray)
319
324
{
320
325
object aobj = obj;
321
- if (PyArray_INT != PyArray_TYPE (pobj ))
326
+ if (NPY_INT != PyArray_TYPE (a ))
322
327
{
323
- object a1 (handle<>(PyArray_Cast (
324
- reinterpret_cast <PyArrayObject*>(pobj),
325
- PyArray_INT)));
328
+ object a1 (handle<>(PyArray_Cast (a, NPY_INT)));
326
329
aobj = a1;
327
330
}
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 );
332
335
rv.assign (pfirst, plast);
333
336
return rv;
334
337
}
0 commit comments