Closed
Description
I tried to use numpy arrays with the C-API and found some strange behavior:
I'm trying to create a C-array-like view onto an numpy (2d and 3d) array using this function:
c-function: print requested item from 2D or 3D-array
static PyObject* test(PyObject* self, PyObject* args) {
PyArrayObject *symbol_series_obj;
npy_intp i=0, j=0, k=0;
if (!PyArg_ParseTuple(args, "O!ll|l",
&PyArray_Type, &symbol_series_obj,
&i, &j, &k)
) return NULL;
if (NULL == symbol_series_obj) return NULL;
// get number of dimensions:
npy_intp num_dims = PyArray_NDIM(symbol_series_obj);
// help-vars
int typenum = NPY_DOUBLE;
PyArray_Descr *descr = PyArray_DescrFromType(typenum);
npy_intp dims[4];
// incref, as PyArray_AsCArray steals reference
Py_INCREF(symbol_series_obj);
// is 2D-array
if (num_dims == 2){
double **symbol_series;
if (PyArray_AsCArray((PyObject **) &symbol_series_obj,
(void **) &symbol_series, dims, 2, descr) < 0){
PyErr_SetString(PyExc_TypeError, "error converting to c array");
return NULL;}
printf("2D-array[%i][%i]: %.2f\n",
(int) i, (int) j, symbol_series[i][j]);
// free C-like array
PyArray_Free((PyObject *) symbol_series_obj, (void *) symbol_series);
}
// is 3D-array
else if (num_dims == 3){
double ***symbol_series;
if (PyArray_AsCArray((PyObject **) &symbol_series_obj,
(void ***) &symbol_series, dims, 3, descr) < 0){
PyErr_SetString(PyExc_TypeError, "error converting to c array");
return NULL;}
printf("3D-array[%i][%i][%i]: %.2f\n",
(int) i, (int) j, (int) k, symbol_series[i][j][k]);
// free C-like array
PyArray_Free((PyObject *) symbol_series_obj, (void *) symbol_series);
}
else {
printf("error not 2D or 3D");
return NULL;
}
Py_RETURN_NONE;
}
python test-case: create array and pick random items
import numpy as np
from my_module import test
def get_random_item(arr):
"selects a random item from given array with numpy and c-ext"
# get coord:
cords = tuple([np.random.randint(dim) for dim in arr.shape])
str_cords = ''.join(("[{}]".format(cord) for cord in cords))
# numpy:
print("numpy: arr{} = {}".format(str_cords, arr[cords]))
# c-version:
test(arr, *cords)
if __name__ == '__main__':
ARR2D = np.arange(0, 0.27, 0.01).reshape(3, 9)
for _ in range(10):
get_random_item(ARR2D)
ARR3D = np.arange(0, 0.27, 0.01).reshape(3, 3, 3)
for _ in range(10):
get_random_item(ARR3D)
issue: python segfaults randomly when getting random items from an 3D-array
(not always during runtime - at the latest on exit)
If I run the test-case only with 2D-arrays, everything works fine and no segfault occurs.
Metadata
Metadata
Assignees
Labels
No labels