X.flat returns an indexable 1-D iterator (mostly similar to an array but always 1-d) --- only has .copy and .__array__ attributes of an array!!! .typecode() --> .dtype.char .iscontiguous() --> .flags['CONTIGUOUS'] or .flags.contiguous .byteswapped() -> .byteswap() .itemsize() -> .itemsize .toscalar() -> .item() If you used typecode characters: 'c' -> 'S1' or 'c' 'b' -> 'B' '1' -> 'b' 's' -> 'h' 'w' -> 'H' 'u' -> 'I' C -level some API calls that used to take PyObject * now take PyArrayObject * (this should only cause warnings during compile and not actual problems). PyArray_Take These commands now return a buffer that must be freed once it is used using PyMemData_FREE(ptr); a->descr->zero --> PyArray_Zero(a) a->descr->one --> PyArray_One(a) Numeric/arrayobject.h --> numpy/oldnumeric.h # These will actually work and are defines for PyArray_BYTE, # but you really should change it in your code PyArray_CHAR --> PyArray_CHAR (or PyArray_STRING which is more flexible) PyArray_SBYTE --> PyArray_BYTE Any uses of character codes will need adjusting.... use PyArray_XXXLTR where XXX is the name of the type. If you used function pointers directly (why did you do that?), the arguments have changed. Everything that was an int is now an intp. Also, arrayobjects should be passed in at the end. a->descr->cast[i](fromdata, fromstep, todata, tostep, n) a->descr->cast[i](fromdata, todata, n, PyArrayObject *in, PyArrayObject *out) anything but single-stepping is not supported by this function use the PyArray_CastXXXX functions.