def convert_from_numpy_array(ll_a): data = (ll_a + NumpyData.data_offset)[0] strides = ffi.cast("intptr_t*", (ll_a + NumpyData.strides_offset)[0]) dims = ffi.cast("intptr_t*", (ll_a + NumpyData.dimensions_offset)[0]) nd = ffi.cast('int *', (ll_a + NumpyData.nd_offset))[0] dims = [dims[i] for i in range(nd)] strides = [strides[i] for i in range(nd)] data = ffi.buffer(ffi.cast("char*", data), sys.maxint) # XXX strides descr = ffi.cast('char*', (ll_a + NumpyData.descr_offset)[0]) type_num = ffi.cast('int*', descr + NumpyData.type_num_offset)[0] dtype = numpy_types[type_num] return numpy.ndarray(dims, buffer=data, dtype=dtype, strides=strides)
def test_pass_ndarray_object_to_c(self): from _numpypy.multiarray import ndarray mod = self.import_extension('foo', [ ("check_array", "METH_VARARGS", ''' PyObject* obj; if (!PyArg_ParseTuple(args, "O!", &PyArray_Type, &obj)) return NULL; Py_INCREF(obj); return obj; '''), ], prologue='#include <numpy/arrayobject.h>') array = ndarray((3, 4), dtype='d') assert mod.check_array(array) is array raises(TypeError, "mod.check_array(42)")