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