# Dendritic NDArray Crate
This crate is the numerical computing crate to work with N Dimensional values.
The operations for this numerical computing library are broken down by aggregate, binary, scalar and unary operations.
This crate serves as the base depedencies for most numerical computing for all the machine learning algorithms dendritic has to offer
## Features
- **NDArray**: General NDArray structure that can work with generic values.
- **Shape**: Shape structure for representing dimension of N Dimensional value
- **Ops**: Operations broken down into different categories supported by the NDArray module
## Disclaimer
The dendritic project is a toy machine learning library built for learning and research purposes.
It is not advised by the maintainer to use this library as a production ready machine learning library.
This is a project that is still very much a work in progress.
## Supported operation types
Currently the numerical operations are only supported for `f64` types. This will change in future releases.
## Binary Operations Example Usage
These are some examples of using the `dendritic_ndarray` create with some basic operations
```rust
use dendritic_ndarray::ndarray::NDArray;
use dendritic_ndarray::ops::*;
fn main() {
let x: NDArray<f64> = NDArray::array(vec![2, 3], vec![0.0,0.0,1.0,1.0,2.0,2.0]).unwrap();
let y: NDArray<f64> = NDArray::array(vec![2, 3], vec![0.0,0.0,1.0,1.0,2.0,2.0]).unwrap();
let add_result : NDArray<f64> = x.add(y).unwrap();
add_result.save("name_of_saved_ndarray").unwrap();
let loaded = NDArray::load("name_of_saved_ndarray").unwrap();
}
```
## Unary Operations Example Usage
These are some examples of using the `dendritic_ndarray` with the unary operations.
Unary operations involve transoforming or modifying the contents of an ndarray and then returning the transformed result.
```rust
use dendritic_ndarray::ndarray::NDArray;
use dendritic_ndarray::ops::*;
fn main() {
let x: NDArray<f64> = NDArray::array(vec![2, 3], vec![0.0,0.0,1.0,1.0,2.0,2.0]).unwrap();
let y : NDArray<f64> = x.transpose().unwrap(); }
```
## Scalar Operations Example Usage
These are some examples of using the `dendritic_ndarray` with the scalar operations.
Scalar operations involve an `ndarray` and a scalar value like an `f64`.
```rust
use dendritic_ndarray::ndarray::NDArray;
use dendritic_ndarray::ops::*;
fn main() {
let x: NDArray<f64> = NDArray::array(vec![2, 3], vec![0.0,0.0,1.0,1.0,2.0,2.0]).unwrap();
let y: f64 = 10.0;
let scalar_result : NDArray<f64> = x.scalar_add(y).unwrap();
}
```
## Aggregate Operations Example Usage
These are some examples of using the `dendritic_ndarray` with the aggregate operations.
Aggregate operations reduce the dimension or result of an operation on an ndarray.
An example of this is statistical operations like taking the average or summing all values.
```rust
use dendritic_ndarray::ndarray::NDArray;
use dendritic_ndarray::ops::*;
fn main() {
let x: NDArray<f64> = NDArray::array(vec![2, 3], vec![0.0,0.0,1.0,1.0,2.0,2.0]).unwrap();
let x_avg: f64 = x.avg();
}
```