gpt4 book ai didi

python - Pybind11:使用 Pybind11 在 C++ 中转换 numpy 数组的问题

转载 作者:行者123 更新时间:2023-12-02 10:23:26 33 4
gpt4 key购买 nike

我正在尝试从 C++ 获取 Python 数组,并将其放回 Python 函数中,同时使用 C++ 和 Pybind11。首先,我访问一个 numpy 数组字典,然后将每个 numpy 数组放入一个 Python 函数中,该函数只计算数组中元素的总和。给我带来麻烦的代码的主要部分是:

        py::array item = list_items.attr("__getitem__")(i); 
//equivalent to dict.__getitem__[i]

//code runs if removing the following line
boost_mod.attr("sum_of_dict")(item).cast<int>();
//calls the function sum_of_dict in the module boost_mod having as argument a 1D numpy array
//this function computes the sum of the elements in the numpy array, which are all integers

我想我有一个转换问题,我不明白如何克服它。我看过 this documentation link但这没有帮助。我也看过不同的 cast可能性,以及其他帖子,如 this one或者这个 other one ,但它们不适用于我的问题,因为它们不使用 pybind。对于转换和使用我的 numpy 数组对象的任何帮助或任何提示将不胜感激。非常感谢你

完整代码如下:

C++代码
#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
#include <chrono>
#include <thread>
#include <Python.h>
namespace py = pybind11;
py::module boost_mod = py::module::import("boost_mod");

int parallelize(py::dict list_items, py::object q_in, py::object q_out){

unsigned int sum = 0;
unsigned int len = list_items.attr("__len__")().cast<int>();
for( unsigned int i = 0; i < len ; i++){

//PROBLEM IS HERE//
py::array item = list_items.attr("__getitem__")(i);
sum+= boost_mod.attr("sum_of_dict")(item).cast<int>();
std::this_thread::sleep_for(std::chrono::milliseconds(5));

}
return sum;
}

PYBIND11_MODULE(cpp_parallel, m) {

m.doc() = "pybind11 plugin";
m.def("parallelize", &parallelize,
"a function");
}

包含函数 的 Python 模块
import numpy as np
import cpp_parallel as cpp

class child(object):
def __init__(self, index):
self.nb = index
self.total = None

def sum(self, i, j):
return self.nb + self.nb

def create_dict(self):
self.list_items = {}
for i in range(self.nb):
lth = np.random.randint(1,10)
a = np.random.binomial(size=lth, n=1, p =0.6)
self.list_items[i] = a
return self.list_items

def sum_of_dict(self, element): # fonction comme eval function
a = np.sum(element)
return a

def sub(self, q_in, q_out):
//FUNCTION CALLED FROM C++//
return cpp.parallelize(self.list_items, q_in, q_out)

Python 代码
from multiprocessing import Process, Queue
import time
import boost_mod as test
import cpp_parallel as cpp

q_in = Queue()
q_out = Queue()

q_in.put(True)

dict_evaluated = test.child(1000)
dict_evaluated.create_dict()
dict_evaluated.sub(q_in, q_out)

最佳答案

实际上我没有正确实例化我从中调用函数的模块。归功于 Wim Lavrijsen。答案如下:

#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
#include <omp.h>
#include <chrono>
#include <thread>
#include <Python.h>
namespace py = pybind11;
py::module boost_mod = py::module::import("boost_mod");


int parallelize(py::object child, py::object q_in, py::object q_out){

unsigned int sum = 0;
py::object items = child.attr("list_items");
unsigned int len = items.attr("__len__")().cast<int>();
#pragma omp simd reduction (+:sum)
for( unsigned int i = 0; i < len ; i++){

py::array item = items.attr("__getitem__")(i);
sum += child.attr("sum_of_dict")(item).cast<int>();
bool accord = q_in.attr("get")().cast<bool>();
if (accord == true){
q_out.attr("put")(sum);
}
accord = false;
std::this_thread::sleep_for(std::chrono::milliseconds(5));
}
return sum;
}

PYBIND11_MODULE(cpp_parallel, m) {

m.doc() = "pybind11 example plugin";

m.def("parallelize", &parallelize,
"the function which parallelizes the evaluation");
}

和子类:
from multiprocessing import Process, Event, Lock, Queue, Pipe
import time
import numpy as np
import cpp_parallel as cpp

class child(object):
def __init__(self, index):
self.nb = index
self.total = None

def sum(self, i, j):
return self.nb + self.nb

def create_dict(self):
self.list_items = {}
for i in range(self.nb):
lth = np.random.randint(1,10)
a = np.random.binomial(size=lth, n=1, p =0.6)
self.list_items[i] = a

def sum_of_dict(self, element): # fonction comme eval function
a = np.sum(element)
return a

def sub(self, q_in, q_out):
return cpp.parallelize(self, q_in, q_out)

关于python - Pybind11:使用 Pybind11 在 C++ 中转换 numpy 数组的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58682579/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com