scipy - Cython/Armadillo 错误:scipy.sparse.csc_matrix 到 SpMat 的转换
问题描述
我目前正在用 Cython 包装 Armadillo 库,并且在通过 Cython 将 Python 中的 scipy.sparse.csc_matrix 转换为来自 Armadillo 的稀疏矩阵类时遇到了一些麻烦。
这样做的功能实际上是这样的:
cdef inline SpMat[double] * sp_to_spmatp(X):
cdef np.ndarray[int, ndim = 1, mode = 'c'] col_ptrs = X.indptr
cdef np.ndarray[int, ndim = 1, mode = 'c'] row_indices = X.indices
cdef np.ndarray[double, ndim = 1, mode = 'c'] values = X.data
cdef SpMat[double] *p_spRes = new SpMat[double](<int*> &row_indices[0], <int*> &col_ptrs[0], <double*> &values[0], X.shape[0], X.shape[1])
return p_spRes
其中X
是 scipyp_spRes
的稀疏矩阵和 Armadillo 的稀疏矩阵。
通过构建它,我得到了这个错误:
arma_wrapper.cpp:3418:549: 错误:没有匹配函数调用'arma::SpMat::SpMat(int*, int*, double*, int&, int&)'</p>
随着:
Armadillo/include/armadillo_bits/SpMat_bones.hpp:103:10: note: candidate: template<class T1, class T2, class T3> arma::SpMat<eT>::SpMat(const arma::Base<long long unsigned int, T1>&, const arma::Base<long long unsigned int, T2>&, const arma::Base<eT, T3>&, arma::uword, arma::uword)
inline SpMat(const Base<uword,T1>& rowind, const Base<uword,T2>& colptr, const Base<eT,T3>& values, const uword n_rows, const uword n_cols);
^~~~~
Armadillo/include/armadillo_bits/SpMat_bones.hpp:103:10: note: template argument deduction/substitution failed:
arma_wrapper.cpp:3418:549: note: mismatched types ‘const arma::Base<long long unsigned int, T1>’ and ‘int*’
].strides)))), ((double *)(&(*__Pyx_BufPtrCContig1d(__pyx_t_5numpy_double_t *, __pyx_pybuffernd_values.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_values.diminfo[0].strides)))), __pyx_t_10, __pyx_t_11);
^
这让我认为某些类型转换可能不正确。
如果有人确实对此有所了解,将不胜感激。
解决方案
推荐阅读
- python - 将新值附加到 Python 字典中的同一键
- makefile - 使用标志 $(@:.o=.d) 后生成文件依赖错误
- java - Apache Camel 调度到本地 JaxRs 资源实现
- javascript - 如何编写异步函数以在 javascript 中查找字符串枚举?
- java - 我在从 Json 输出中获取数据时遇到问题
- python - 根据熊猫规则改变数量的Pythonic方式?
- reactjs - 数组不使用 useState 钩子和 for 循环更新
- c++ - 用于 。/ 在 C++ 中 - 运算符还是浮点数?
- swift - Swift - 实例化一个类 - 带括号和不带括号的区别
- jquery - 如何使用 jQuery 更新 div 中的 HTML 元素