Ejemplo n.º 1
0
/*NUMPY_API
 * For backward compatibility
 *
 * Cast an array using typecode structure.
 * steals reference to at --- cannot be NULL
 */
NPY_NO_EXPORT PyObject *
PyArray_CastToType(PyArrayObject *mp, PyArray_Descr *at, int fortran)
{
    PyObject *out;
    int ret;
    PyArray_Descr *mpd;

    mpd = mp->descr;

    if (((mpd == at) ||
                ((mpd->type_num == at->type_num) &&
                 PyArray_EquivByteorders(mpd->byteorder, at->byteorder) &&
                 ((mpd->elsize == at->elsize) || (at->elsize==0)))) &&
                 PyArray_ISBEHAVED_RO(mp)) {
        Py_DECREF(at);
        Py_INCREF(mp);
        return (PyObject *)mp;
    }

    if (at->elsize == 0) {
        PyArray_DESCR_REPLACE(at);
        if (at == NULL) {
            return NULL;
        }
        if (mpd->type_num == PyArray_STRING &&
            at->type_num == PyArray_UNICODE) {
            at->elsize = mpd->elsize << 2;
        }
        if (mpd->type_num == PyArray_UNICODE &&
            at->type_num == PyArray_STRING) {
            at->elsize = mpd->elsize >> 2;
        }
Ejemplo n.º 2
0
/* new reference */
NPY_NO_EXPORT PyArray_Descr *
_array_typedescr_fromstr(char *str)
{
    PyArray_Descr *descr;
    int type_num;
    char typechar;
    int size;
    char msg[] = "unsupported typestring";
    int swap;
    char swapchar;

    swapchar = str[0];
    str += 1;

    typechar = str[0];
    size = atoi(str + 1);
    switch (typechar) {
    case 'b':
        if (size == sizeof(npy_bool)) {
            type_num = NPY_BOOL;
        }
        else {
            PyErr_SetString(PyExc_ValueError, msg);
            return NULL;
        }
        break;
    case 'u':
        if (size == sizeof(npy_uintp)) {
            type_num = NPY_UINTP;
        }
        else if (size == sizeof(char)) {
            type_num = NPY_UBYTE;
        }
        else if (size == sizeof(short)) {
            type_num = NPY_USHORT;
        }
        else if (size == sizeof(npy_ulong)) {
            type_num = NPY_ULONG;
        }
        else if (size == sizeof(int)) {
            type_num = NPY_UINT;
        }
        else if (size == sizeof(npy_ulonglong)) {
            type_num = NPY_ULONGLONG;
        }
        else {
            PyErr_SetString(PyExc_ValueError, msg);
            return NULL;
        }
        break;
    case 'i':
        if (size == sizeof(npy_intp)) {
            type_num = NPY_INTP;
        }
        else if (size == sizeof(char)) {
            type_num = NPY_BYTE;
        }
        else if (size == sizeof(short)) {
            type_num = NPY_SHORT;
        }
        else if (size == sizeof(long)) {
            type_num = NPY_LONG;
        }
        else if (size == sizeof(int)) {
            type_num = NPY_INT;
        }
        else if (size == sizeof(npy_longlong)) {
            type_num = NPY_LONGLONG;
        }
        else {
            PyErr_SetString(PyExc_ValueError, msg);
            return NULL;
        }
        break;
    case 'f':
        if (size == sizeof(float)) {
            type_num = NPY_FLOAT;
        }
        else if (size == sizeof(double)) {
            type_num = NPY_DOUBLE;
        }
        else if (size == sizeof(npy_longdouble)) {
            type_num = NPY_LONGDOUBLE;
        }
        else {
            PyErr_SetString(PyExc_ValueError, msg);
            return NULL;
        }
        break;
    case 'c':
        if (size == sizeof(float)*2) {
            type_num = NPY_CFLOAT;
        }
        else if (size == sizeof(double)*2) {
            type_num = NPY_CDOUBLE;
        }
        else if (size == sizeof(npy_longdouble)*2) {
            type_num = NPY_CLONGDOUBLE;
        }
        else {
            PyErr_SetString(PyExc_ValueError, msg);
            return NULL;
        }
        break;
    case 'O':
        if (size == sizeof(PyObject *)) {
            type_num = NPY_OBJECT;
        }
        else {
            PyErr_SetString(PyExc_ValueError, msg);
            return NULL;
        }
        break;
    case NPY_STRINGLTR:
        type_num = NPY_STRING;
        break;
    case NPY_UNICODELTR:
        type_num = NPY_UNICODE;
        size <<= 2;
        break;
    case 'V':
        type_num = NPY_VOID;
        break;
    default:
        PyErr_SetString(PyExc_ValueError, msg);
        return NULL;
    }

    descr = PyArray_DescrFromType(type_num);
    if (descr == NULL) {
        return NULL;
    }
    swap = !PyArray_ISNBO(swapchar);
    if (descr->elsize == 0 || swap) {
        /* Need to make a new PyArray_Descr */
        PyArray_DESCR_REPLACE(descr);
        if (descr==NULL) {
            return NULL;
        }
        if (descr->elsize == 0) {
            descr->elsize = size;
        }
        if (swap) {
            descr->byteorder = swapchar;
        }
    }
    return descr;
}