2008-10-18 9 views
8

En el lado Python, puedo crear nuevas matrices de registro numpy de la siguiente manera:Cómo crear una matriz de registro numpy de C

numpy.zeros((3,), dtype=[('a', 'i4'), ('b', 'U5')]) 

¿Cómo puedo hacer lo mismo de un programa en C? Supongo que tengo que llamar al PyArray_SimpleNewFromDescr(nd, dims, descr), pero ¿cómo puedo construir un PyArray_Descr que sea apropiado para pasar como tercer argumento al PyArray_SimpleNewFromDescr?

Respuesta

10

Use PyArray_DescrConverter. He aquí un ejemplo:

#include <Python.h> 
#include <stdio.h> 
#include <numpy/arrayobject.h> 

int main(int argc, char *argv[]) 
{ 
    int dims[] = { 2, 3 }; 
    PyObject *op, *array; 
    PyArray_Descr *descr; 

    Py_Initialize(); 
    import_array(); 
    op = Py_BuildValue("[(s, s), (s, s)]", "a", "i4", "b", "U5"); 
    PyArray_DescrConverter(op, &descr); 
    Py_DECREF(op); 
    array = PyArray_SimpleNewFromDescr(2, dims, descr); 
    PyObject_Print(array, stdout, 0); 
    printf("\n"); 
    Py_DECREF(array); 
    return 0; 
} 

Gracias a Adam Rosenfield para señalar a la Sección 13.3.10 del Guide to NumPy.

5

Ver el Guide to NumPy, sección 13.3.10. Hay muchas maneras diferentes de hacer un descriptor, aunque no es tan fácil como escribir [('a', 'i4'), ('b', 'U5')].

+0

Gracias, la Guía menciona 'PyArray_DescrConverter', que funciona. He publicado un ejemplo como una respuesta separada, ya que no cabe en un comentario. –

+0

Ese enlace no funciona para mí. ¿Alguien tiene un enlace actualizado? –

+0

@JoelVroom: No sé qué pasó con el enlace original, pero pude encontrar otro enlace al mismo documento con bastante facilidad. –

Cuestiones relacionadas