use crate::array::Array;
use crate::error::Result;
pub fn atleast_1d<T: Clone + num_traits::Zero>(arys: &[&Array<T>]) -> Result<Vec<Array<T>>> {
let mut result = Vec::with_capacity(arys.len());
for &array in arys {
if array.ndim() == 0 {
let scalar_value = array
.get(&[])
.expect("scalar array (ndim=0) should have a value at empty index");
result.push(Array::from_vec(vec![scalar_value]).reshape(&[1]));
} else {
result.push(array.clone());
}
}
Ok(result)
}
pub fn atleast_2d<T: Clone + num_traits::Zero>(arys: &[&Array<T>]) -> Result<Vec<Array<T>>> {
let mut result = Vec::with_capacity(arys.len());
for &array in arys {
if array.ndim() == 0 {
let scalar_value = array
.get(&[])
.expect("scalar array (ndim=0) should have a value at empty index");
result.push(Array::from_vec(vec![scalar_value]).reshape(&[1, 1]));
} else if array.ndim() == 1 {
let data = array.to_vec();
let new_shape = vec![1, data.len()];
result.push(Array::from_vec(data).reshape(&new_shape));
} else {
result.push(array.clone());
}
}
Ok(result)
}
pub fn atleast_3d<T: Clone + num_traits::Zero>(arys: &[&Array<T>]) -> Result<Vec<Array<T>>> {
let mut result = Vec::with_capacity(arys.len());
for &array in arys {
if array.ndim() == 0 {
let scalar_value = array
.get(&[])
.expect("scalar array (ndim=0) should have a value at empty index");
result.push(Array::from_vec(vec![scalar_value]).reshape(&[1, 1, 1]));
} else if array.ndim() == 1 {
let data = array.to_vec();
let new_shape = vec![1, data.len(), 1];
result.push(Array::from_vec(data).reshape(&new_shape));
} else if array.ndim() == 2 {
let data = array.to_vec();
let shape = array.shape();
let new_shape = vec![shape[0], shape[1], 1];
result.push(Array::from_vec(data).reshape(&new_shape));
} else {
result.push(array.clone());
}
}
Ok(result)
}