通过 Pybind11 将 Eigen csr_matrix 导出到 python 而不转换为 scipy.sparse.csc/csr 矩阵
Exporting Eigen csr_matrix to python via Pybind11 without converting to scipy.sparse.csc/csr matrix
我想将特征 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>
与将本征稀疏矩阵封装在另一个 class 中相比,是否有更简单的方法来实现此目的?
简而言之,我想在不涉及 scipy.sparse 的情况下公开本征稀疏矩阵。
o.k.,张贴问题似乎有帮助。虽然我现在已经为这个问题苦苦挣扎了一段时间,但只有在发布问题后我才找到解决方案,即我必须包括一个
PYBIND11_MAKE_OPAQUE(TpSpMatrix_csr);
在我的 pybind 接口文件的顶部。
我现在可以根据需要调用我的测试函数。
我希望这可以帮助遇到类似问题的其他人。
我想将特征 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>
与将本征稀疏矩阵封装在另一个 class 中相比,是否有更简单的方法来实现此目的?
简而言之,我想在不涉及 scipy.sparse 的情况下公开本征稀疏矩阵。
o.k.,张贴问题似乎有帮助。虽然我现在已经为这个问题苦苦挣扎了一段时间,但只有在发布问题后我才找到解决方案,即我必须包括一个
PYBIND11_MAKE_OPAQUE(TpSpMatrix_csr);
在我的 pybind 接口文件的顶部。 我现在可以根据需要调用我的测试函数。 我希望这可以帮助遇到类似问题的其他人。