use rustnum as np;
fn main() {
let a = np::arange(0.0, 6.0, 1.0).reshape(&[2, 3]);
let b = np::array![10.0, 20.0, 30.0];
let zeros = np::zeros::<f64>(&[2, 2]);
let eye = np::eye::<f64>(3);
let ramp = np::linspace(0.0, 1.0, 5);
println!("a =\n{a}");
println!("b = {b}");
println!("zeros =\n{zeros}");
println!("eye(3) =\n{eye}");
println!("linspace(0, 1, 5) = {ramp}");
println!(
"shape = {:?}, ndim = {}, size = {}",
a.shape(),
a.ndim(),
a.size()
);
let c = &a + &b;
println!("\na + b =\n{c}");
println!("a * 2.0 + 1.0 =\n{}", &a * 2.0 + 1.0);
println!("1.0 / (a + 1.0) =\n{}", 1.0 / (&a + 1.0));
println!("\nc[:, 1] = {}", c.slice(&np::s![.., 1]));
println!("c[::-1, :2] =\n{}", c.slice(&np::s![..;-1, ..2]));
println!("last column = {}", c.slice(&np::s![.., -1]));
let big = c.gt(20.0);
println!("\nc > 20 =\n{big}");
println!("c[c > 20] = {}", c.mask(&big));
println!("\nsum = {}", c.sum());
println!("mean = {}", c.mean());
println!("max = {}", c.max());
println!("column means (axis 0) = {}", c.mean_axis(0));
println!("row maxima (axis 1) = {}", c.max_axis(1));
println!("argmax (flat index) = {}", c.argmax());
println!("\nc.T =\n{}", c.t());
println!("a @ a.T =\n{}", a.matmul(&a.t()));
println!("a.reshape(-1) = {}", a.reshape_infer(&[-1]));
println!("\nsqrt(a) =\n{}", a.sqrt());
println!("clip(a, 1, 4) =\n{}", a.clip(1.0, 4.0));
let mut row = a.row(0);
row.fill(9.0);
println!("\nrow after fill = {row}");
println!("a is unchanged =\n{a}");
let mut d = a.copy();
d.slice_assign(&np::s![.., 0], -1.0);
println!("d with first column set to -1 =\n{d}");
}