2008-10-18 23 views
8

po stronie Python, mogę tworzyć nowe tablice rekordowe numpy następująco:Jak utworzyć tablicę z rekordową numpy C

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

Jak mogę zrobić to samo z programu C? Przypuszczam, że muszę zadzwonić pod numer PyArray_SimpleNewFromDescr(nd, dims, descr), ale jak skonstruować PyArray_Descr, który jest odpowiedni do przekazania jako trzeci argument do PyArray_SimpleNewFromDescr?

Odpowiedz

10

Użyj PyArray_DescrConverter. Oto przykład:

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

Dzięki Adam Rosenfield dla wskazując na punkcie 13.3.10 z Guide to NumPy.

5

Zobacz Guide to NumPy, sekcja 13.3.10. Istnieje wiele różnych sposobów tworzenia deskryptorów, chociaż nie jest to tak łatwe jak pisanie [('a', 'i4'), ('b', 'U5')].

+0

Dzięki temu przewodnik wspomniał o 'PyArray_DescrConverter', który działa. Wysłałem przykład jako osobną odpowiedź, ponieważ nie mieści się w komentarzu. –

+0

Ten link nie działa dla mnie. Czy ktoś ma zaktualizowany link? –

+0

@JoelVroom: Nie wiem, co się stało z pierwotnym linkiem, ale udało mi się łatwo znaleźć inny link do tego samego dokumentu. –