# narr

<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->

``` python
# #| hide
# from narr.strs import snake_case
# from narr.axes import NamedAxis, NamedAxes
# from narr.errs import NamedArrayDimsError
# from narr.mixs import NamedArrayDynamicAttrsMixin
# from narr.narr import NamedArray
# from narr.traj import (
#     TrajectoryDim, GeneTrajectoryDim,
#     ObservationTrajectories, FeatureTrajectories,
#     CellularTrajectories, ExpressionTrajectories,
#     Trajectories, GeneTrajectories,
# )
```

## Developer Guide

### Setup

``` sh
# create conda environment
$ mamba env create -f env.yml

# update conda environment
$ mamba env update -n narr --file env.yml
```

### Install

``` sh
pip install -e .

# install from pypi
pip install narr
```

### nbdev

``` sh
# activate conda environment
$ conda activate narr

# make sure the narr package is installed in development mode
$ pip install -e .

# make changes under nbs/ directory
# ...

# compile to have changes apply to the narr package
$ nbdev_prepare
```

### Publishing

``` sh
# publish to pypi
$ nbdev_pypi

# publish to conda
$ nbdev_conda --build_args '-c conda-forge'
$ nbdev_conda --mambabuild --build_args '-c conda-forge -c dsm-72'
```

# Usage

## Installation

Install latest from the GitHub
[repository](https://github.com/dsm-72/narr):

``` sh
$ pip install git+https://github.com/dsm-72/narr.git
```

or from [conda](https://anaconda.org/dsm-72/narr)

``` sh
$ conda install -c dsm-72 narr
```

or from [pypi](https://pypi.org/project/narr/)

``` sh
$ pip install narr
```

## Documentation

Documentation can be found hosted on GitHub
[repository](https://github.com/dsm-72/narr)
[pages](https://dsm-72.github.io/narr/). Additionally you can find
package manager specific guidelines on
[conda](https://anaconda.org/dsm-72/narr) and
[pypi](https://pypi.org/project/narr/) respectively.

``` python
# import numpy as np
# from typing import Callable
```

### Subclassing NamedArray

``` python
# class Trajectories(NamedArray):
#     DIMS = NamedAxes([NamedAxis(dim.name, i) for i, dim in enumerate(TrajectoryDim)])
    
#     def to_obsv_x_traj(self, aggr: Callable = np.mean):
#         agg_arr = aggr(np.asarray(self.transpose(
#             TrajectoryDim.obsv.name, TrajectoryDim.traj.name, TrajectoryDim.feat.name,            
#         )), axis=2)
#         return ObservationTrajectories(agg_arr)
        
#     def to_feat_x_traj(self, aggr: Callable = np.mean):
#         agg_arr = aggr(np.asarray(self.transpose(
#             TrajectoryDim.feat.name, TrajectoryDim.traj.name, TrajectoryDim.obsv.name,            
#         )), axis=2)
#         return FeatureTrajectories(agg_arr)
```

### Using NamedArray Subclass Trajectories

``` python
# arr = np.random.randint(0, 10, (3, 5, 10))
# arr
```

    array([[[9, 7, 1, 4, 8, 2, 3, 3, 3, 1],
            [0, 3, 8, 7, 2, 9, 9, 9, 1, 7],
            [0, 8, 5, 3, 3, 8, 8, 1, 3, 8],
            [3, 6, 9, 1, 8, 7, 7, 3, 1, 3],
            [0, 0, 2, 9, 1, 6, 6, 8, 1, 7]],

           [[5, 9, 5, 7, 3, 2, 1, 0, 9, 5],
            [9, 8, 7, 3, 1, 7, 6, 6, 0, 5],
            [8, 2, 9, 7, 2, 9, 4, 4, 0, 8],
            [2, 8, 2, 2, 0, 6, 6, 8, 6, 9],
            [5, 5, 2, 2, 3, 5, 9, 9, 3, 4]],

           [[3, 6, 4, 6, 3, 2, 4, 6, 9, 0],
            [7, 1, 6, 7, 7, 2, 6, 2, 2, 8],
            [2, 3, 6, 2, 5, 5, 2, 6, 2, 0],
            [3, 9, 8, 5, 1, 5, 7, 8, 7, 9],
            [9, 2, 1, 5, 2, 7, 0, 7, 4, 3]]])

``` python
# Trajectories(arr)
```

    Trajectories([[[9, 7, 1, 4, 8, 2, 3, 3, 3, 1],
                   [0, 3, 8, 7, 2, 9, 9, 9, 1, 7],
                   [0, 8, 5, 3, 3, 8, 8, 1, 3, 8],
                   [3, 6, 9, 1, 8, 7, 7, 3, 1, 3],
                   [0, 0, 2, 9, 1, 6, 6, 8, 1, 7]],

                  [[5, 9, 5, 7, 3, 2, 1, 0, 9, 5],
                   [9, 8, 7, 3, 1, 7, 6, 6, 0, 5],
                   [8, 2, 9, 7, 2, 9, 4, 4, 0, 8],
                   [2, 8, 2, 2, 0, 6, 6, 8, 6, 9],
                   [5, 5, 2, 2, 3, 5, 9, 9, 3, 4]],

                  [[3, 6, 4, 6, 3, 2, 4, 6, 9, 0],
                   [7, 1, 6, 7, 7, 2, 6, 2, 2, 8],
                   [2, 3, 6, 2, 5, 5, 2, 6, 2, 0],
                   [3, 9, 8, 5, 1, 5, 7, 8, 7, 9],
                   [9, 2, 1, 5, 2, 7, 0, 7, 4, 3]]])
                   (3 traj, 5 obsv, 10 feat)

``` python
# Trajectories(arr).transpose(1, 0, 2)
```

    Trajectories([[[9, 7, 1, 4, 8, 2, 3, 3, 3, 1],
                   [5, 9, 5, 7, 3, 2, 1, 0, 9, 5],
                   [3, 6, 4, 6, 3, 2, 4, 6, 9, 0]],

                  [[0, 3, 8, 7, 2, 9, 9, 9, 1, 7],
                   [9, 8, 7, 3, 1, 7, 6, 6, 0, 5],
                   [7, 1, 6, 7, 7, 2, 6, 2, 2, 8]],

                  [[0, 8, 5, 3, 3, 8, 8, 1, 3, 8],
                   [8, 2, 9, 7, 2, 9, 4, 4, 0, 8],
                   [2, 3, 6, 2, 5, 5, 2, 6, 2, 0]],

                  [[3, 6, 9, 1, 8, 7, 7, 3, 1, 3],
                   [2, 8, 2, 2, 0, 6, 6, 8, 6, 9],
                   [3, 9, 8, 5, 1, 5, 7, 8, 7, 9]],

                  [[0, 0, 2, 9, 1, 6, 6, 8, 1, 7],
                   [5, 5, 2, 2, 3, 5, 9, 9, 3, 4],
                   [9, 2, 1, 5, 2, 7, 0, 7, 4, 3]]])
                   (5 obsv, 3 traj, 10 feat)

``` python
# Trajectories(arr).transpose('obsv', 0, 2)
```

    Trajectories([[[9, 7, 1, 4, 8, 2, 3, 3, 3, 1],
                   [5, 9, 5, 7, 3, 2, 1, 0, 9, 5],
                   [3, 6, 4, 6, 3, 2, 4, 6, 9, 0]],

                  [[0, 3, 8, 7, 2, 9, 9, 9, 1, 7],
                   [9, 8, 7, 3, 1, 7, 6, 6, 0, 5],
                   [7, 1, 6, 7, 7, 2, 6, 2, 2, 8]],

                  [[0, 8, 5, 3, 3, 8, 8, 1, 3, 8],
                   [8, 2, 9, 7, 2, 9, 4, 4, 0, 8],
                   [2, 3, 6, 2, 5, 5, 2, 6, 2, 0]],

                  [[3, 6, 9, 1, 8, 7, 7, 3, 1, 3],
                   [2, 8, 2, 2, 0, 6, 6, 8, 6, 9],
                   [3, 9, 8, 5, 1, 5, 7, 8, 7, 9]],

                  [[0, 0, 2, 9, 1, 6, 6, 8, 1, 7],
                   [5, 5, 2, 2, 3, 5, 9, 9, 3, 4],
                   [9, 2, 1, 5, 2, 7, 0, 7, 4, 3]]])
                   (5 obsv, 3 traj, 10 feat)

``` python
# Trajectories(arr).transpose('obsv', 0, 2).to_obsv_x_traj()
```

    NameError: name 'aggr' is not defined
