types::ndarray<long, 1> flatnonzero(E const& expr) { long n = expr.size(); long *buffer = (long*)malloc(sizeof(long) * n); long *iter = buffer; long i = 0; _flatnonzero(expr.begin(), expr.end(), iter, i, utils::int_<types::numpy_expr_to_ndarray<E>::N>()); long shape[1] = { iter - buffer }; return types::ndarray<long, 1>(buffer, shape); }
types::ndarray<long, 1> flatnonzero(E const &expr) { long n = expr.flat_size(); utils::shared_ref<types::raw_array<long>> buffer(n); long *iter = buffer->data; long i = 0; _flatnonzero(expr.begin(), expr.end(), iter, i, utils::int_<E::value>()); types::array<long, 1> shape = {iter - buffer->data}; return types::ndarray<long, 1>(std::move(buffer), shape); }
void _flatnonzero(I begin, I end, O& out, long& i, utils::int_<N>) { for(; begin != end; ++begin) _flatnonzero((*begin).begin(), (*begin).end(), out, i, utils::int_<N - 1>()); }