[PYTHON] Conseils pour manipuler numpy.ndarray à partir de c ++ -Je veux utiliser un itérateur-

Objectif

En utilisant boost.python et boost.numpy, vous pouvez facilement créer un module python capable de gérer numpy.ndarray avec c ++. Bien que boost.numpy soit une bibliothèque bien conçue, elle présente certains inconvénients pour accéder aux données, tels que l'impossibilité d'utiliser des itérateurs. Par conséquent, rendez les données facilement accessibles.

Contexte

Qu'est-ce que numpy.ndarray

C'est un tableau multidimensionnel fourni par numpy, l'un des packages python. Sans cela, les calculs numériques en python sont si largement utilisés que c'est impossible.

Qu'est-ce que boost.numpy

Une bibliothèque qui vous permet d'utiliser numpy à partir de c ++. Accédez aux données comme suit.

namespace bp = boost::python;
namespace np = boost::numpy;

void func(np::ndarray &data2d) {
  //data2d est i comme un tableau à deux dimensions,Remplacer 0 pour j élément
  for (int i = 0; i < data2d.shape(0); ++i) {
    for (int j = 0; j < data2d.shape(1); ++j) {
      data2d[bp::make_tuple(i, j)] = 0.0;
    }
  }
}

Conditions pour les astuces

Pour utiliser cette astuce, les conditions suivantes doivent être remplies.

Je pense que la première condition sera remplie dans de nombreux cas. En outre, le second devrait être satisfait à moins qu'il ne s'agisse d'une variable qui a été initialement coupée d'un grand tableau.

Activer l'itérateur

Utilisez boost.multi_array_ref. Comme numpy.ndarray est un tableau multidimensionnel de python, c ++ utilise également la bibliothèque de tableaux multidimensionnels. boost.multi_array_ref est une version auto-allouée de boost.multi_array. Cliquez ici pour une explication détaillée de boost.multi_array. (boost :: multi_array --Kmonos.net) Au fait, il existe aussi une version qui ne peut lire que boost.const_multi_array_ref et ne peut pas écrire.

Exemple concret

void func(np:ndarray &data2d) {
  const std::array<int, 2> shape = {data2d.shape(0), data2d.shape(1)};
  boost::multi_array_ref<double, 2> wrapper(reinterpret_cast<double*>(data2d.get_data()), shape);
  // i,wrapper pour j élément[i][j]Accessible avec, mais utilise un itérateur
  for (boost::multi_array_ref_double, 2>::subarray<1>::type &&sub : wrapper) {
    boost::fill(sub, 0.0);
  }
}

Ensuite, vous pouvez y accéder comme ça.

Bien sûr, l'utilisation de boost.multi_array_ref entraîne une surcharge. Il existe également un moyen de manipuler directement les pointeurs (Tutoriel Boost.NumPy pour l'extension de Python en C ++ (Pratique)), mais avec une surcharge. Je voudrais prendre des mesures de sécurité sans m'en soucier.

D'ailleurs, dans l'exemple ci-dessus, boost :: multi_array_ref <double, 2> et un wrapper pour un tableau bidimensionnel sont préparés car il est facile à comprendre et a un sens d'introduction.

const std::array<int, 1> shape = {data2d.shape(0) * data2d.shape(1)};
  boost::multi_array_ref<double, 1> wrapper(reinterpret_cast<double*>(data2d.get_data()), shape); 
boost::fill(wrapper, 0.0);

Ce faisant, le processus est terminé en un seul coup.

finalement

Après tout, la bibliothèque Boost peut également être utilisée ici. Si vous connaissez un autre bon moyen (bibliothèque autre que boost.multi_array_ref, quelque chose pour remplacer boost.numpy, etc.), veuillez nous en informer.

Recommended Posts

Conseils pour manipuler numpy.ndarray à partir de c ++ -Je veux utiliser un itérateur-
Je veux utiliser jar de python
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 9 Utilisation à partir du langage C
Je veux utiliser le solveur ceres de python
Je veux créer du code C ++ à partir de code Python!
Conseils pour appeler Python à partir de C
Je souhaite utiliser une bibliothèque externe avec IBM Cloud Functions
Je souhaite utiliser à la fois la clé et la valeur de l'itérateur Python
Je veux utiliser Linux sur mac
Je souhaite utiliser la console IPython Qt
Je veux faire un programme d'automatisation!
Une introduction à Python pour les programmeurs en langage C
[Python] J'ai été accro pendant une heure à essayer d'utiliser la notation d'inclusion de liste
Je souhaite me connecter à PostgreSQL à partir de plusieurs langues
Je veux utiliser MATLAB feval avec python
Je souhaite envoyer un e-mail depuis Gmail en utilisant Python.
[Python] Je veux gérer 7DaysToDie depuis Discord! 1/3
Je veux être OREMO avec setParam!
Envelopper C avec Cython pour une utilisation à partir de Python
Je veux faire des crises de ma tête
Je souhaite utiliser le répertoire temporaire avec Python2
Je ne veux pas utiliser -inf avec np.log
Je souhaite utiliser ip vrf avec SONiC
[Python] Je veux gérer 7DaysToDie depuis Discord! 2/3
Envelopper C ++ avec Cython pour une utilisation à partir de Python
Je souhaite utiliser la fonction d'activation Mish
[Python] Je souhaite utiliser uniquement l'index lors de la mise en boucle d'une liste avec une instruction for
Je veux convertir une image en WebP avec sucette
Je veux voir le nom de fichier de DataLoader
Je veux détecter des images de chats d'Instagram
Je veux utiliser self avec Backpropagation (tf.custom_gradient) (tensorflow)
Je souhaite développer des applications Android sur Android (débogage)
Je voulais utiliser la bibliothèque Python de MATLAB
Je souhaite utiliser OpenJDK 11 avec Ubuntu Linux 18.04 LTS / 18.10
Je veux utiliser le jeu de données R avec python
[Pour les débutants] Je souhaite expliquer le nombre d’apprentissage d’une manière facile à comprendre.
[Pour ceux qui veulent utiliser TPU] J'ai essayé d'utiliser l'API de détection d'objets Tensorflow 2
Je souhaite copier un article en anglais à partir d'un pdf et le mettre dans Google Traduction
Je souhaite utiliser l'environnement de bureau d'Ubuntu sur Android pour le moment (version Termux)
Je souhaite utiliser l'environnement de bureau d'Ubuntu sur Android pour le moment (version UserLAnd)
Je ne veux pas rechercher de para haut parce que c'est IQ1 (comment utiliser lightgbm_tuner)
[TensorFlow] Je souhaite maîtriser l'indexation pour Ragged Tensor
Je veux utiliser la dernière version de gcc même si je n'ai pas les privilèges sudo! !!
Je souhaite utiliser facilement les fonctions R avec le notebook ipython
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 4 Utiliser l'interface graphique
Je veux échanger des cadeaux même pour moi! [Christmas Hackason]
Je veux déplacer le sélénium pour le moment [pour mac]
Je veux démarrer beaucoup de processus à partir de python
[NetworkX] Je souhaite rechercher des nœuds avec des attributs spécifiques
Je souhaite utiliser uniquement le traitement de normalisation SudachiPy
Je souhaite calculer le temps d'arrêt autorisé à partir du taux de fonctionnement
[Python] Je souhaite utiliser l'option -h avec argparse
Je souhaite utiliser un environnement virtuel avec jupyter notebook!
Je souhaite convertir une chaîne de caractères ISO-8601 en heure japonaise
Je ne savais pas comment utiliser l'instruction [python] for
Je veux installer le package de requirements.txt avec poésie
Je souhaite envoyer un message de Python à LINE Bot
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image par eux-mêmes
Utilisez un langage de script pour une vie C ++ confortable-OpenCV-Port Python vers C ++ -