在pybind11中输入npz文件

问题描述

我正在尝试用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文件存储到向量中?

谢谢

解决方法

我对numpy不太了解,但这是我在手册中发现的:

load()npz文件一起使用时,将创建numpy.lib.npyio.NpzFile实例,而不是array实例。这是关于NpzFile的手册中的重要部分:

类似于字典的对象,可以在构建时提供的压缩存档中延迟加载文件。

NpzFile用于以NumPy .npz数据存档格式加载文件。假定归档文件中的文件扩展名为.npy,其他文件将被忽略。

使用obj ['key']延迟在getitem访问中加载数组和文件字符串,或者使用obj.f.key延迟进行属性查找。可以使用obj.files和ZipFile对象本身(使用obj.zip)获得所有文件的列表(不带.npy扩展名)。

这意味着您可以通过以下方式访问阵列:

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传递。