2008-10-18 7 views
8

Auf der Python Seite erstellen, kann ich neue numpy Rekord-Arrays erstellen wie folgt:Wie ein numpy Rekord Array von C

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

Wie kann ich von einem C-Programm das gleiche tun? Ich nehme an, ich muss anrufen PyArray_SimpleNewFromDescr(nd, dims, descr), aber wie konstruiere ich eine PyArray_Descr, die für die Weitergabe als das dritte Argument an PyArray_SimpleNewFromDescr geeignet ist?

Antwort

10

Verwenden Sie PyArray_DescrConverter. Hier ein Beispiel:

#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; 
} 

Dank Adam Rosenfield für den Hinweis auf Abschnitt 13.3.10 der Guide to NumPy.

5

Siehe die Guide to NumPy, Abschnitt 13.3.10. Es gibt viele verschiedene Möglichkeiten, einen Deskriptor zu erstellen, obwohl es nicht annähernd so einfach ist wie das Schreiben von [('a', 'i4'), ('b', 'U5')].

+0

Danke, die Anleitung erwähnt 'PyArray_DescrConverter', die funktioniert. Ich habe ein Beispiel als separate Antwort gepostet, da es nicht in einen Kommentar passt. –

+0

Dieser Link funktioniert nicht für mich. Jeder hat einen aktualisierten Link? –

+0

@JoelVroom: Ich weiß nicht, was mit dem ursprünglichen Link passiert ist, aber ich konnte einfach einen anderen Link zum selben Dokument finden. –