我正在尝试用pybind11包装一个npz文件。我在python中有以下参数,其中函数pathlookup在c++中:
import testpy_path
sourcefile1 = np.load('data1.npy')
sourcefile2 = np.load('data2.npz')
testpy_path.pathlookup(sourcefile1, sourcefile2) //error at sourcefile2
在带有pybind11的C++中,我试图生成numpy输入sourcefile1和sourcefile2,如下所示:void pathlookup(py::array_t<double, py::array::c_style | py::array::forecast> sourcefile1, py::array_t<double, py::array::c_style | py::array::forecast> sourcefile2){
std::vector<double> sources1(sourcefile1.size());
std::memcpy(sources1.data(), sourcefile1.data(), sourcefile1.size() * sizeof(double));
}
它与.npy文件的sourcefile1一起正常工作,但不适用于numpy .npz文件。我的问题是,要使用npz文件,函数pathlookup c++中需要哪些参数?如何将npz文件存储到 vector 中?谢谢
最佳答案
我对numpy
不太了解,但这是我在手册中找到的:
当您将load()
与npz
文件一起使用时,就会创建numpy.lib.npyio.NpzFile
实例,而不是array
实例。这是有关NpzFile
的手册中的重要部分:
这意味着您可以通过以下方式访问阵列:
np.savez("out.npz", x=data)
x = np.load("out.npz")['x']
然后x
可以传递给您的函数。https://www.kite.com/python/docs/numpy.lib.npyio.NpzFile
编辑:
如果您希望直接通过
pybind
加载numpy数组,则可以执行以下操作:auto np = py::module::import("numpy");
py::dict d = np.attr("load")("out.npz");
for(auto k : d)
{
std::cout << k.first.cast<std::string>() << std::endl;
std::cout << k.second.cast<py::array>().size() << std::endl;
}
或将NPZ文件句柄作为dict
传递。