|
2 | 2 |
|
3 | 3 | use std::{mem, os::raw::c_int, ptr}; |
4 | 4 |
|
5 | | -use ndarray::{ArrayBase, Data, Dim, Dimension, IntoDimension, Ix1, OwnedRepr}; |
| 5 | +use ndarray::{ArrayBase, Data, Dim, Dimension, IntoDimension, Ix1, Ix2, OwnedRepr}; |
6 | 6 | use pyo3::{Bound, Python}; |
7 | 7 |
|
8 | 8 | use crate::array::{PyArray, PyArrayMethods}; |
@@ -90,6 +90,31 @@ impl<T: Element> IntoPyArray for Vec<T> { |
90 | 90 | } |
91 | 91 | } |
92 | 92 |
|
| 93 | +#[cfg(feature = "faer")] |
| 94 | +impl<T: Element> IntoPyArray for faer::Mat<T> { |
| 95 | + type Item = T; |
| 96 | + type Dim = Ix2; |
| 97 | + |
| 98 | + fn into_pyarray<'py>(mut self, py: Python<'py>) -> Bound<'py, PyArray<Self::Item, Self::Dim>> { |
| 99 | + let dims = Dim([self.nrows(), self.ncols()]); |
| 100 | + let rstride = self.row_stride(); |
| 101 | + let cstride = self.col_stride(); |
| 102 | + // let strides = [mem::size_of::<T>() as npy_intp, mem::size_of::<T>() as npy_intp]; |
| 103 | + let strides = [rstride*mem::size_of::<T>() as npy_intp, cstride*mem::size_of::<T>() as npy_intp]; |
| 104 | + let data_ptr = self.as_ptr_mut(); |
| 105 | + unsafe { |
| 106 | + PyArray::from_raw_parts( |
| 107 | + py, |
| 108 | + dims, |
| 109 | + strides.as_ptr(), |
| 110 | + data_ptr, |
| 111 | + PySliceContainer::from(self), |
| 112 | + ) |
| 113 | + } |
| 114 | + } |
| 115 | +} |
| 116 | + |
| 117 | + |
93 | 118 | impl<A, D> IntoPyArray for ArrayBase<OwnedRepr<A>, D> |
94 | 119 | where |
95 | 120 | A: Element, |
|
0 commit comments