通过Pybind11将Eigen csr_matrix导出到python,而无需转换为scipy.sparse.csc/



我想将特征csr稀疏矩阵导出到python中,以便执行基准测试。我很清楚scipy.sparse csr矩阵遵循csr矩阵的规范格式,而eigen有不同的表示,这正是我想要使用的
然而,在导出特征csr矩阵时,pybind11将其导出为scipy.sparse类型,而我实际上希望避免这种情况。

我尝试了以下方法:

typedef Eigen::SparseMatrix< double >  TpSpMatrix_csr;
py::class_<TpSpMatrix_csr> csr_matrix_eigen(m, "csr_matrix_eigen");
csr_matrix_eigen
.def(py::init<>()
, "Default constructor"
)
.def(py::init<TpSpMatrix_csr>()
, "Init with csr matrix"
, py::arg("A")
)
;
m.def("csr_test", []( TpSpMatrix_csr& A) { std::cout << "csr!"<< std::endl; }
, "csr test"
, py::arg("A").noconvert()
);

在将其导入ipython后,我得到以下内容:

In [2]: A = csr_matrix_eigen()
In [3]: csr_test(A)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-77568ef56cf5> in <module>
----> 1 csr_test(A)
TypeError: csr_test(): incompatible function arguments. The following argument types are supported:
1. (A: scipy.sparse.csc_matrix[numpy.float64]) -> None
Invoked with: <eigen_test.csr_matrix_eigen object at 0x7f9e78265af0>

与将特征稀疏矩阵封装在另一类中相比,有没有更简单的方法可以实现这一点
简而言之,我想在不涉及scipy.sparse的情况下公开本征稀疏矩阵。

好吧,发布问题似乎有帮助。尽管我已经为这个问题挣扎了一段时间,但只有在发布了这个问题后,我才找到了一个解决方案,即,我必须包含一个

PYBIND11_MAKE_OPAQUE(TpSpMatrix_csr);

在我的pybind接口文件的顶部。我现在可以根据需要调用我的测试函数了。我希望这能帮助其他发音相似的人。

最新更新