MCPcopy Create free account
hub / github.com/numpy/numpy / PyArray_AsCArray

Function PyArray_AsCArray

numpy/core/src/multiarray/multiarraymodule.c:261–317  ·  view source on GitHub ↗

NUMPY_API * Simulate a C-array * steals a reference to typedescr -- can be NULL */

Source from the content-addressed store, hash-verified

259 * steals a reference to typedescr -- can be NULL
260 */
261NPY_NO_EXPORT int
262PyArray_AsCArray(PyObject **op, void *ptr, npy_intp *dims, int nd,
263 PyArray_Descr* typedescr)
264{
265 PyArrayObject *ap;
266 npy_intp n, m, i, j;
267 char **ptr2;
268 char ***ptr3;
269
270 if ((nd < 1) || (nd > 3)) {
271 PyErr_SetString(PyExc_ValueError,
272 "C arrays of only 1-3 dimensions available");
273 Py_XDECREF(typedescr);
274 return -1;
275 }
276 if ((ap = (PyArrayObject*)PyArray_FromAny(*op, typedescr, nd, nd,
277 NPY_ARRAY_CARRAY, NULL)) == NULL) {
278 return -1;
279 }
280 switch(nd) {
281 case 1:
282 *((char **)ptr) = PyArray_DATA(ap);
283 break;
284 case 2:
285 n = PyArray_DIMS(ap)[0];
286 ptr2 = (char **)PyArray_malloc(n * sizeof(char *));
287 if (!ptr2) {
288 PyErr_NoMemory();
289 return -1;
290 }
291 for (i = 0; i < n; i++) {
292 ptr2[i] = PyArray_BYTES(ap) + i*PyArray_STRIDES(ap)[0];
293 }
294 *((char ***)ptr) = ptr2;
295 break;
296 case 3:
297 n = PyArray_DIMS(ap)[0];
298 m = PyArray_DIMS(ap)[1];
299 ptr3 = (char ***)PyArray_malloc(n*(m+1) * sizeof(char *));
300 if (!ptr3) {
301 PyErr_NoMemory();
302 return -1;
303 }
304 for (i = 0; i < n; i++) {
305 ptr3[i] = (char **) &ptr3[n + m * i];
306 for (j = 0; j < m; j++) {
307 ptr3[i][j] = PyArray_BYTES(ap) + i*PyArray_STRIDES(ap)[0] + j*PyArray_STRIDES(ap)[1];
308 }
309 }
310 *((char ****)ptr) = ptr3;
311 }
312 if (nd) {
313 memcpy(dims, PyArray_DIMS(ap), nd*sizeof(npy_intp));
314 }
315 *op = (PyObject *)ap;
316 return 0;
317}
318

Callers

nothing calls this directly

Calls 5

PyArray_FromAnyFunction · 0.85
PyArray_DATAFunction · 0.85
PyArray_DIMSFunction · 0.85
PyArray_BYTESFunction · 0.85
PyArray_STRIDESFunction · 0.85

Tested by

no test coverage detected