278 ValueHolder
makeArray (PyObject* obj_ptr, Bool copyData)
281 throw AipsError (
"PycArray: python object is not an array");
283 PyArrayObject* po = (PyArrayObject*)obj_ptr;
284 boost::python::object obj;
285 bool docopy = copyData;
286 if (! PyArray_ISCONTIGUOUS(po)
287 || ! PyArray_ISALIGNED(po)
288 || PyArray_ISBYTESWAPPED(po)) {
289 boost::python::handle<> py_hdl(obj_ptr);
290 boost::python::object py_obj(py_hdl);
292 boost::python::incref(obj_ptr);
293 obj = py_obj.attr(
"copy")();
294 po = (PyArrayObject*)(obj.ptr());
299 int nd = PyArray_NDIM(po);
303 for (
int i=0; i<nd; i++) {
304 shp[i] = PyArray_DIMS(po)[nd-i-1];
309 if (shp.product() > 0) {
312 && !PyArray_ISBYTESWAPPED(po), AipsError);
315 switch (PyArray_TYPE(po)) {
344 if (PyArray_TYPE(po) == NPY_UINT64) {
346 Array<Int64> res(arr.shape());
347 convertArray (res, arr);
348 return ValueHolder(res);
349 }
else if (PyArray_TYPE(po) == NPY_INT8) {
351 Array<Short> res(arr.shape());
352 convertArray (res, arr);
353 return ValueHolder(res);
354 }
else if (PyArray_TYPE(po) == NPY_UINT8) {
357 Array<Short> res(arr.shape());
359 Array<uChar>* uarr =
static_cast<Array<uChar>*
>(varr);
360 convertArray (res, *uarr);
361 return ValueHolder(res);
362 }
else if (PyArray_TYPE(po) == NPY_STRING) {
365 slen = PyArray_STRIDES(po)[nd-1];
368 }
else if (PyArray_TYPE(po) == NPY_UNICODE) {
371 slen = PyArray_STRIDES(po)[nd-1];
377 throw AipsError (
"PycArray: unknown python array data type");