我正在尝试用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传递。

07-24 09:23