// Passing in a generic array double sum(py::array xs) { py::buffer_info info = xs.request(); auto ptr = static_cast<double *>(info.ptr); int n = 1; for (auto r: info.shape) { n *= r; } double s = 0.0; for (int i = 0; i <n; i++) { s += *ptr++; } return s; }
static void CopyInto(py::array dst, py::array src) { if (0 != PyArray_SIZE((PyArrayObject *) dst.ptr()) && 0 != PyArray_SIZE((PyArrayObject *) src.ptr())) { int ret = PyArray_CopyInto((PyArrayObject *) dst.ptr(), (PyArrayObject *) src.ptr()); if (-1 == ret) { throw py::error_already_set(); } } }
static int NDIM (py::array arr) { return PyArray_NDIM ((PyArrayObject *) arr.ptr()); }
std::vector<PybindT> arr2vec (ade::Shape& outshape, py::array data) { py::buffer_info info = data.request(); outshape = pyead::p2cshape(info.shape); size_t n = outshape.n_elems(); auto dtype = data.dtype(); char kind = dtype.kind(); py::ssize_t tbytes = dtype.itemsize(); std::vector<PybindT> vec; switch (kind) { case 'f': switch (tbytes) { case 4: // float32 { float* dptr = static_cast<float*>(info.ptr); vec = std::vector<PybindT>(dptr, dptr + n); } break; case 8: // float64 { double* dptr = static_cast<double*>(info.ptr); vec = std::vector<PybindT>(dptr, dptr + n); } break; default: logs::fatalf("unsupported float type with %d bytes", tbytes); } break; case 'i': switch (tbytes) { case 1: // int8 { int8_t* dptr = static_cast<int8_t*>(info.ptr); vec = std::vector<PybindT>(dptr, dptr + n); } break; case 2: // int16 { int16_t* dptr = static_cast<int16_t*>(info.ptr); vec = std::vector<PybindT>(dptr, dptr + n); } break; case 4: // int32 { int32_t* dptr = static_cast<int32_t*>(info.ptr); vec = std::vector<PybindT>(dptr, dptr + n); } break; case 8: // int64 { int64_t* dptr = static_cast<int64_t*>(info.ptr); vec = std::vector<PybindT>(dptr, dptr + n); } break; default: logs::fatalf("unsupported integer type with %d bytes", tbytes); } break; default: logs::fatalf("unknown dtype %c", kind); } return vec; }