diff --git a/include/Data/SpectrogramTimeSerie.h b/include/Data/SpectrogramTimeSerie.h index 30988df..4dd3c2a 100644 --- a/include/Data/SpectrogramTimeSerie.h +++ b/include/Data/SpectrogramTimeSerie.h @@ -18,6 +18,16 @@ public: .begin()); SpectrogramTimeSerie() {} + SpectrogramTimeSerie(SpectrogramTimeSerie::axis_t& t, + SpectrogramTimeSerie::axis_t& y, + SpectrogramTimeSerie::container_type< + SpectrogramTimeSerie::raw_value_type>& values, + std::vector& shape) + : TimeSeries::TimeSerie(t, values, shape) + { + _axes[1] = y; + } + ~SpectrogramTimeSerie() = default; using TimeSerie::TimeSerie; }; diff --git a/src/pybind11_wrappers/CoreWrappers.cpp b/src/pybind11_wrappers/CoreWrappers.cpp index 6bacd15..40e2b53 100644 --- a/src/pybind11_wrappers/CoreWrappers.cpp +++ b/src/pybind11_wrappers/CoreWrappers.cpp @@ -59,14 +59,36 @@ void copy_scalar(py::array_t& t, py::array_t& values, T& dest_t, } } } +template +void copy_multicomp(py::array_t& t, py::array_t& values, + T& dest_t, U& dest_values) +{ + auto t_view = t.unchecked<1>(); + auto values_view = values.unchecked<2>(); + const auto width = values.shape(1); + for(std::size_t i = 0; i < t.size(); i++) + { + dest_t[i] = t_view[i]; + for(int j = 0; j < width; j++) + { + dest_values[i * width + j] = values_view(i, j); + } + } +} template -void copy_spectro(py::array_t& t, py::array_t& values, - T& dest_t, U& dest_values) +void copy_spectro(py::array_t& t, py::array_t& y, + py::array_t& values, T& dest_t, T& dest_y, + U& dest_values) { auto t_view = t.unchecked<1>(); + auto y_view = y.unchecked<1>(); auto values_view = values.unchecked<2>(); const auto width = values.shape(1); + for(std::size_t i = 0; i < y.size(); i++) + { + dest_y[i] = y_view[i]; + } for(std::size_t i = 0; i < t.size(); i++) { dest_t[i] = t_view[i]; @@ -112,6 +134,11 @@ PYBIND11_MODULE(pysciqlopcore, m) [](TimeSeries::ITimeSerie& ts) -> decltype(ts.axis(0))& { return ts.axis(0); }, + py::return_value_policy::reference) + .def( + "axis", + [](TimeSeries::ITimeSerie& ts, unsigned int index) + -> decltype(ts.axis(0))& { return ts.axis(index); }, py::return_value_policy::reference); py::class_ VectorTimeSerie::raw_value_type& { return ts[key]; }, - py::return_value_policy::reference) + .def( + "__getitem__", + [](VectorTimeSerie& ts, std::size_t key) + -> VectorTimeSerie::raw_value_type& { return ts[key]; }, + py::return_value_policy::reference) .def("__setitem__", [](VectorTimeSerie& ts, std::size_t key, VectorTimeSerie::raw_value_type value) { *(ts.begin() + key) = value; @@ -179,7 +207,7 @@ PYBIND11_MODULE(pysciqlopcore, m) MultiComponentTimeSerie::container_type< MultiComponentTimeSerie::raw_value_type> _values(values.size()); - copy_spectro(t, values, _t, _values); + copy_multicomp(t, values, _t, _values); std::vector shape; shape.push_back(values.shape(0)); shape.push_back(values.shape(1)); @@ -202,17 +230,20 @@ PYBIND11_MODULE(pysciqlopcore, m) std::shared_ptr>(m, "SpectrogramTimeSerie") .def(py::init<>()) .def(py::init>()) - .def(py::init([](py::array_t t, py::array_t values) { + .def(py::init([](py::array_t t, py::array_t y, + py::array_t values) { assert(t.size() < values.size()); // TODO check geometry + assert(y.size() == values.shape(1)); SpectrogramTimeSerie::axis_t _t(t.size()); + SpectrogramTimeSerie::axis_t _y(y.size()); SpectrogramTimeSerie::container_type< SpectrogramTimeSerie::raw_value_type> _values(values.size()); - copy_spectro(t, values, _t, _values); + copy_spectro(t, y, values, _t, _y, _values); std::vector shape; shape.push_back(values.shape(0)); shape.push_back(values.shape(1)); - return SpectrogramTimeSerie(_t, _values, shape); + return SpectrogramTimeSerie(_t, _y, _values, shape); })) .def("__getitem__", [](SpectrogramTimeSerie& ts, diff --git a/tests/TestVariables.py b/tests/TestVariables.py index bcb92a9..fd251c6 100755 --- a/tests/TestVariables.py +++ b/tests/TestVariables.py @@ -126,13 +126,15 @@ class TimeSeriesData(unittest.TestCase): self.assertEqual(ts[i].z,i*100.) def test_build_SpectrogramTimeSerie_from_np_arrays(self): - v=np.ones((10,4)) - for i in range(4): - v.transpose()[:][i] = np.arange(10)*10**i - ts = pysciqlopcore.SpectrogramTimeSerie(np.arange(10), v) + v=np.ones((10,30)) + for i in range(30): + v.transpose()[:][i] = np.arange(10)*10**(i/10.) + ts = pysciqlopcore.SpectrogramTimeSerie(np.arange(10),np.arange(30), v) for i in range(len(ts)): - for j in range(4): - self.assertEqual(ts[i][j], i*10**j) + for j in range(30): + self.assertEqual(ts[i][j], i*10**(j/10.)) + for i in range(30): + self.assertEqual(ts.axis(1)[i], i) class VariableData(unittest.TestCase): def test_default_state(self):