Extension Python C / C ++: transmettre une partie des données à Python en tant que np.array (set stride)

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

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

const int np=10;
Particle* const p= calloc(sizeof(Particle), np);

for(int i=0; i<np; ++i) {
  p[i].x[0]= (float) i + 1;
}

Si vous voulez passer ceci à Python en tant que np.array, vous pouvez utiliser la fonction PyArray_SimpleNewFromData. [^ 1]

Cependant, ici je vais vous montrer comment ne transmettre qu'une partie des données, x [3], comme np.array à Python. Dans certains cas, la structure de données peut contenir plusieurs types et pas tous dans un np.array.

Si les données n'existent pas en continu dans la mémoire comme ceci, mais qu'elles sont disposées à intervalles réguliers, vous pouvez définir des «foulées». [^ 2]

PyObject* PyArray_New(PyTypeObject* subtype, int nd, npy_intp* dims, 
			           int type_num, npy_intp* strides, void* data, 
			           int itemsize, int flags, PyObject* obj);

Qu'est-ce que strides []? Quand ʻaest np.array,strides [0]est la différence d'octet entre ʻa [i, j] ʻ et ʻa [i + 1, j],strides [] [1] ʻest la différence d'octet entre ʻa [i, j] et ʻa [i, j + 1].

static PyObject* py_as_nparray(PyObject *self, PyObject *args)
{
  const int nd=2;
  const int ncol= 3;
  npy_intp dims[]= {np, ncol};
  npy_intp strides[]= {sizeof(Particle), sizeof(float)};

  return PyArray_New(&PyArray_Type, nd, dims, NPY_FLOAT, strides, p->x, 0, 0, 0);
}

Résultats de Python

import numpy as np
import cext08

a = cext08.as_nparray()

[[  1.   0.   0.]
 [  2.   0.   0.]
 [  3.   0.   0.]
 [  4.   0.   0.]
 ...

Le code entier est sur github

https://github.com/junkoda/python_c_ext/tree/master/08_nparray_stride

Recommended Posts

Extension Python C / C ++: transmettre une partie des données à Python en tant que np.array (set stride)
Modèle d'extension Python C / C ++ - Passez des données à Python en tant que np.array
Transmettez les données OpenCV de la bibliothèque C ++ d'origine à Python
[Introduction à Python] J'ai comparé les conventions de nommage de C # et Python.
[pepper] Transmettez toutes les données JSON obtenues par requête python à la tablette.
Passez le chemin du module python importé
Essayez d'imaginer les données d'élévation du National Land Research Institute avec Python
Définissez le nom du processus du programme Python
[Introduction au Data Scientist] Bases de Python ♬
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
Organiser les outils Python pour accélérer le mouvement initial des compétitions d'analyse de données
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
Comment utiliser la bibliothèque C en Python
J'ai touché certaines des nouvelles fonctionnalités de Python 3.8 ①
L'histoire de la lecture des données HSPICE en Python
Transition du baseball vue à partir des données
Comment lire des données originales ou des données externes sur Internet avec scikit-learn au lieu d'un ensemble de données attaché tel que l'iris
Tutoriel "Cython" pour rendre Python explosif: Passez l'objet de classe C ++ à l'objet de classe côté Python. Partie 2
[Python] Méthode de calcul de la formule d'approximation de la même section 0 qu'Excel [scikit-learn] Mémo
Ne prenez pas une instance d'une classe d'exception Python directement comme argument de la classe d'exception!
Il est temps de réfléchir sérieusement à la définition et aux compétences des data scientists
Un moyen simple de vérifier la source des modules Python
Le mur lors du passage du service Django de Python 2.7 à la série Python 3
Résumé des outils nécessaires pour analyser les données en Python
Modèle de script python pour lire le contenu du fichier
Comment obtenir le nombre de chiffres en Python
(Python) Traite les valeurs entières comme un ensemble d'indicateurs
[python] option pour désactiver la sortie de click.progressbar
Points Python du point de vue d'un programmeur en langage C
Ne pas être conscient du contenu des données en python
Écrire des données dans KINTONE à l'aide du module de requêtes Python
[Blender] Comment définir dynamiquement les sélections EnumProperty
Spécifiez MinGW comme compilateur utilisé dans Python
Utilisons les données ouvertes de "Mamebus" en Python
Définissez la colonne spécifiée de QTableWidget sur ReadOnly StyledItemDelegate
14 quiz pour comprendre la portée étonnamment compliquée de Python
Comprendre l'état de la perte de données - Python vs R
[Introduction à Python] Utilisation basique de la bibliothèque matplotlib
Pour faire l'équivalent de Ruby ObjectSpace._id2ref en Python
Entièrement traduit le site du "Guide de l'auto-stoppeur de Python"
Note Python: Le mystère de l'attribution d'une variable à une variable
J'ai essayé de résumer les opérations de chaîne de Python
[C / C ++] Passez la valeur calculée en C / C ++ à une fonction python pour exécuter le processus et utilisez cette valeur en C / C ++.
Tutoriel "Cython" pour rendre Python explosif: Passez un objet de classe C ++ à un objet de classe côté Python. Partie ①
Renvoyez les données d'image avec Flask of Python et dessinez-les dans l'élément canvas de HTML
(Peut-être) Test d'analyse des données de certification d'ingénieur Python 3 que vous pouvez passer par lui-même
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python (version non bloquante)
le zen de Python
J'ai essayé de trouver l'entropie de l'image avec python
Essayez d'obtenir la liste des fonctions du paquet Python> os
[Python] Il peut être utile de lister les trames de données
Facilitez la compréhension de l'affichage des exceptions du module Python
L'histoire de l'introduction de Jedi (package de complétion automatique de python) dans emacs
Différentes façons de calculer la similitude entre les données avec python
(Note) Comment passer le chemin de votre propre module
L'histoire du rubyiste aux prises avec Python :: Dict data with pycall