Modèle d'extension Python C / C ++ - Passez des données à Python en tant que np.array

Affichez les données C / C ++ comme np.array à partir de Python.

struct Particle {
  float x[3], v[3];
};

vector<Particle> v;

Et supposons que des données telles que «Particle *» se trouvent du côté C / C ++.

numpy.array from C/C++ Tout d'abord, incluez numpy / arrayobject.h et initialisez-le. Cela semble initialiser une variable statique, et si vous avez plus d'un code source, vous devez appeler ʻimport_array () `dans tout le code source qui utilise numpy. Sinon, vous obtiendrez une erreur de segmentation.

#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include "numpy/arrayobject.h"

PyMODINIT_FUNC
PyInit_cext07(void) {
  import_array();
  return PyModule_Create(&module);
}

Définissez ʻinclude_dirs dans setup.py` pour lire l'en-tête NumPy.

import numpy as np
from distutils.core import setup, Extension

setup(name='cext07',
      version='0.0.1',
      description='c_ext07 read data as np.array',
      author='Jun Koda',
      url='https://github.com/junkoda/python_c_ext',
      ext_modules=[
          Extension('cext07', ['cext07.c'],
                    include_dirs = [np.get_include()]),
      ],
)

Où sont les données en Python

Une fonction qui passe un pointeur vers vector <Particle> afin qu'il puisse être référencé du côté Python:

static void py_particles_free(PyObject *obj);

static PyObject* py_particles_alloc(PyObject *self, PyObject *args)
{
  // Allocate a new C++ pointer as a Python object "_Particles"
  vector<Particle>* const p= new vector<Particle>();

  p->resize(10); //En supposant que les données contiennent 10 particules
  
  return PyCapsule_New(p, "_Particles", py_particles_free);
}

void py_particles_free(PyObject *obj)
{
  // Destructor function for _Particles pointer, called automatically from Python
  vector<Particle>* const p=
    (vector<Particle>*) PyCapsule_GetPointer(obj, "_Particles");
    
  delete p;
}

Transmettez les données à Python en tant que np.array

Une fonction qui passe vector <Particle> comme np.array:

PyObject* py_as_array(PyObject *self, PyObject *args)
{
  PyObject* py_particles;
  if(!PyArg_ParseTuple(args, "O", &py_particles))
    return NULL;

  // Get vector<Particle>* pointer back from _Particles
  vector<Particle>* const p=
    (vector<Particle>*) PyCapsule_GetPointer(py_particles, "_Particles");
  if(!p) return NULL;

  int nd=2; //Tableau à deux dimensions avec des lignes et des colonnes
  int ncol= sizeof(Particle)/sizeof(float); // ncol=6 x[3], v[3]6 rangs
  npy_intp dims[]= {(npy_intp) p->size(), ncol};

  return PyArray_SimpleNewFromData(nd, dims, NPY_FLOAT, &(p->front()));
}

Fonctions d'extension C / C ++ usuelles

static PyMethodDef methods[] = {
  {"_particles_alloc", py_particles_alloc, METH_VARARGS, "new Particles"},
  {"_as_array", py_as_array, METH_VARARGS, "vector<Particle> as an array"},
  {NULL, NULL, 0, NULL}
};

static struct PyModuleDef module = {
  PyModuleDef_HEAD_INIT,
  "cext07",                // name of this module
  "Use vector<Particle>",  // Doc String
  -1,
  methods
};

Emballage avec la classe Python

import numpy as np
import cext07

class Particles:
    def __init__(self):
        self._p= cext07._particles_alloc() # _Pointeur de particules

    def __repr__(self):
        return cext07._as_array(self._p).__repr__()
    
    def __getitem__(self, index):
        return cext07._as_array(self._p)[index]
    
    def asarray(self):
        return cext07._as_array(self._p)        
    #etc

import cext07
p = Particles()
p        # __repr__Voit le tableau par
p[0]     # __getitem__;Première particule
p[2:5,2] #tranche est aussi np.le tableau le gère
p[:,0]   # x[0]
p[:,4]   # v[1]
p[:]     #Toutes les données

Postscript

Dans cet exemple, nous n'avons besoin d'aucune classe Python, juste de la fonction as_array. Je vais simplifier plus tard.

Tous les codes

Le code complet peut être trouvé sur GitHub.

Recommended Posts

Modèle d'extension Python C / C ++ - Passez des données à Python en tant que np.array
Extension Python C / C ++: transmettre une partie des données à Python en tant que np.array (set stride)
Pointeur de modèle d'extension Python C / C ++
J'ai essayé l'extension C de Python
Transmettez les données OpenCV de la bibliothèque C ++ d'origine à Python
[Python] Comment FFT des données mp3
Numba pour accélérer en Python
Introduction à Protobuf-c (langage C ⇔ Python)
Comment envelopper C en Python
[Python] Comment stocker un fichier csv en tant que données de tableau à une dimension
[Introduction à Python3, jour 17] Chapitre 8 Destinations de données (8.1-8.2.5)
[Introduction à Python3, jour 17] Chapitre 8 Destinations de données (8.3-8.3.6.1)
Convertir des données Excel en JSON avec python
[Introduction à Python3 Jour 19] Chapitre 8 Destinations de données (8.4-8.5)
Convertissez des données FX 1 minute en données 5 minutes avec Python
[Introduction à Python3 Day 18] Chapitre 8 Destinations de données (8.3.6.2 à 8.3.6.3)
Comment utiliser "deque" pour les données Python
Compressez les données python et écrivez sur sqlite
[Introduction au Data Scientist] Bases de Python ♬
Communication de données chiffrées entre Python et C #
Une introduction à Python pour les programmeurs en langage C
Convertir les données csv, tsv en une matrice avec MovieLens en utilisant python comme exemple
Comment utiliser la bibliothèque C en Python
Utilisez Python pour une sortie formatée telle que C / C ++ printf
Comment générer une séquence en Python et C ++
Écriture de journaux dans un fichier CSV (Python, langage C)
[Python] Comment lire les données de CIFAR-10 et CIFAR-100
J'ai essayé d'obtenir des données CloudWatch avec Python
[Introduction à Python] Comment gérer les données au format JSON
Addictif quand Kintone est un magasin de données
[Python] Flux du scraping Web à l'analyse des données
Écrire des données CSV sur AWS-S3 avec AWS-Lambda + Python
Comment générer "Ketsumaimo" en standard en Python
Je veux créer du code C ++ à partir de code Python!
Exécutez Python sur Apache pour afficher les données InfluxDB
Je souhaite obtenir des attributs de données personnalisés de HTML sous forme d'éléments à l'aide de Python Selenium
Analyse de données python
notes de python C ++
python, openFrameworks (c ++)
"Backport" vers python 2
[python] Lecture de données
Résumé des outils nécessaires pour analyser les données en Python
Essayez de créer un module Python en langage C
[Pour les débutants] Comment étudier le test d'analyse de données Python3
Comment récupérer des données d'image de Flickr avec Python
Note de lecture: Introduction à l'analyse de données avec Python
[Introduction à python] Introduction rapide à Python pour les programmeurs C ++ occupés
Envoyer des données de Python au traitement via une communication socket
Écrire des données dans KINTONE à l'aide du module de requêtes Python
Spécifiez MinGW comme compilateur utilisé dans Python
J'ai senti que j'avais porté le code Python en C ++ 98.
[Introduction à Udemy Python3 + Application] 68. Instruction d'importation et AS
[Python] Comment appeler une fonction de c depuis python (édition ctypes)
[Livre technique] Introduction à l'analyse de données avec Python -1 Chapitre Introduction-