В настоящее время я обертываю библиотеку Armadillo в Cython, и у меня возникли проблемы с преобразованием scipy.sparse.csc_matrix в Python через Cython в класс разреженной матрицы из Armadillo.
Функция, которая на самом деле похожа наthis:
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
- это разреженная матрица от scipy и p_spRes
- разреженная матрица от Armadillo.
При ее построении я получаю эту ошибку:
arma_wrapper.cpp: 3418: 549: ошибка: нет соответствующей функции для вызова 'arma :: SpMat :: SpMat (int *, int *, double *, int &, int &)'
вместе с:
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);
^
, что заставляет меня думать, что некоторые типы приведений могут быть неправильными.
Если кто-нибудь что-нибудь знает об этом, это будет очень признательно.