dendritic_preprocessing/
standard_scalar.rs1use dendritic_ndarray::ndarray::NDArray;
2use dendritic_ndarray::ops::*;
3
4pub fn standard_scalar(input: NDArray<f64>) -> Result<NDArray<f64>, String> {
6
7 if input.rank() < 2 {
8 return Err(
9 "Standard Scalar: Must be with rank 2 or higher".to_string()
10 );
11 }
12
13 let mean_vals = input.mean(1).unwrap();
14 let stdev_vals = input.stdev(1).unwrap();
15 let shape = input.shape().dim(1);
16 let mut feature_vec: Vec<f64> = Vec::new();
17
18 for idx in 0..shape {
19 let axis_vals = input.axis(1, idx).unwrap();
20 let mean_val = mean_vals[idx];
21 let stdev_val = stdev_vals[idx];
22 let subtract_mean = axis_vals.scalar_subtract(mean_val).unwrap();
23 let div_stdev = subtract_mean.scalar_div(stdev_val).unwrap();
24 let mut dev_vals = div_stdev.values().clone();
25 feature_vec.append(&mut dev_vals);
26 }
27
28 let temp: NDArray<f64> = NDArray::array(
29 vec![shape, input.shape().dim(0)],
30 feature_vec
31 ).unwrap();
32
33 let result = temp.transpose().unwrap();
34 Ok(result)
35}
36
37
38pub fn min_max_scalar(input: NDArray<f64>) -> Result<NDArray<f64>, String> {
40
41 if input.rank() < 2 {
42 return Err(
43 "MinMax Scalar: Must be with rank 2 or higher".to_string()
44 );
45 }
46
47 let shape = input.shape().dim(1);
48 let mut feature_vec: Vec<f64> = Vec::new();
49
50 for idx in 0..shape {
51
52 let axis_vals = input.axis(1, idx).unwrap();
53
54 let min = axis_vals.values().iter().min_by(
55 |a, b| a.total_cmp(b)
56 ).unwrap();
57
58 let max = axis_vals.values().iter().max_by(
59 |a, b| a.total_cmp(b)
60 ).unwrap();
61
62 let subtract_min = axis_vals.scalar_subtract(*min).unwrap();
63 let min_max = max - min;
64 let div = subtract_min.scalar_div(min_max).unwrap();
65 let mut div_values = div.values().clone();
66 feature_vec.append(&mut div_values);
67 }
68
69
70 let temp: NDArray<f64> = NDArray::array(
71 vec![shape, input.shape().dim(0)],
72 feature_vec
73 ).unwrap();
74
75 let result = temp.transpose().unwrap();
76 Ok(result)
77}