2017-11-06 2 views
1

In numpy, können Sie auf die Größe und Form des Arrays mit array.size und array.shape zugreifen, während Elemente mit array[i] zugegriffen werden können.Numpy Like Arrays für C

Wie erreicht man dies mit einer C-Struktur? Man kann so etwas wie

struct{ 
    int size; 
    int shape[2]; 
    int *elements; 
} int_array; 

tun, aber dann können Elemente wie

int_array.elements[i]. 

nicht wie numpy zugegriffen werden.

Wie kann ich ein Array haben, das Größe und Form speichert, auf dessen Elemente aber in gewohnter Weise mit [] zugegriffen werden kann?

+1

verwenden Was ist die Frage? –

+0

Sollte mit geeigneten (lokalen) VLA typedef (und Typ Cast oder Hilfsvariable dieses Typs) möglich sein. – hyde

+0

Wenn C++ ist eine Option, [check out 'xtensor'] (https://github.com/QuantStack/xtensor) – Eric

Antwort

2
  1. Ordnen Sie ein Array zu, das drei Zellen größer ist, als Sie benötigen.
  2. Geben Sie Größe und Form in die ersten 3 Zellen ein
  3. Erhöhen Sie den Zeiger um 3 * sizeof(int).
  4. Schreibaccessoren für Größe und Form.

Sie können dann auf das Array in der üblichen Weise zugreifen.

Vergessen Sie nicht, 3 * sizeof(int) vom Zeiger zu subtrahieren, bevor Sie es freigeben.

+0

Nun, das funktioniert nur direkt für Arrays, wo die Elementtypen groß genug sind, um die Dimensionen zu halten ... –

1

Sie könnten ein einfaches Makro verwenden Sie den Mauszeiger auf ein 2D-Array (source) zu werfen:

#define INDEX(a) ((int(*)[a.shape[1]]) a.elements) 

, die Sie als

#include <stdio.h> 
#include <stdlib.h> 

typedef struct{ 
    int size; 
    int shape[2]; 
    int *elements; 
} int_array; 


int main() { 
    int_array arr; 
    arr.shape[0] = 2; 
    arr.shape[1] = 3; 
    arr.elements = malloc(6*sizeof(*arr.elements)); 

    INDEX(arr)[0][1] = 2; 

    printf("%d", INDEX(arr)[0][1]); 
}