npz 文件作为 pybind11 中的输入
npz file as input in pybind11
我正在尝试用 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));
}
它适用于 sourcefile1 .npy 文件,但不适用于 numpy .npz 文件。我的问题是,函数 pathlookup c++ 中使用 npz 文件所需的参数是什么?我如何将 npz 文件存储到向量中?
谢谢
我对numpy
不是很有经验,但这是我在手册中找到的:
当您将 load()
与 npz
文件一起使用时,会创建 numpy.lib.npyio.NpzFile
个实例,而不是 array
个实例。这是手册中关于 NpzFile
:
的重要部分
A dictionary-like object with lazy-loading of files in the zipped archive provided on construction.
NpzFile is used to load files in the NumPy .npz data archive format. It assumes that files in the archive have a .npy extension, other files are ignored.
The arrays and file strings are lazily loaded on either getitem access using obj['key'] or attribute lookup using obj.f.key. A list of all files (without .npy extensions) can be obtained with obj.files and the ZipFile object itself using obj.zip.
这意味着您可以通过以下方式访问数组:
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
.
传递
我正在尝试用 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));
}
它适用于 sourcefile1 .npy 文件,但不适用于 numpy .npz 文件。我的问题是,函数 pathlookup c++ 中使用 npz 文件所需的参数是什么?我如何将 npz 文件存储到向量中?
谢谢
我对numpy
不是很有经验,但这是我在手册中找到的:
当您将 load()
与 npz
文件一起使用时,会创建 numpy.lib.npyio.NpzFile
个实例,而不是 array
个实例。这是手册中关于 NpzFile
:
A dictionary-like object with lazy-loading of files in the zipped archive provided on construction.
NpzFile is used to load files in the NumPy .npz data archive format. It assumes that files in the archive have a .npy extension, other files are ignored.
The arrays and file strings are lazily loaded on either getitem access using obj['key'] or attribute lookup using obj.f.key. A list of all files (without .npy extensions) can be obtained with obj.files and the ZipFile object itself using obj.zip.
这意味着您可以通过以下方式访问数组:
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
.