ferray_ma/
constructors.rs1use ferray_core::Array;
8use ferray_core::dimension::Dimension;
9use ferray_core::dtype::Element;
10use ferray_core::error::FerrayResult;
11use num_traits::Float;
12
13use crate::MaskedArray;
14
15pub fn masked_where<T: Element + Copy, D: Dimension>(
20 condition: &Array<bool, D>,
21 data: &Array<T, D>,
22) -> FerrayResult<MaskedArray<T, D>> {
23 MaskedArray::new(data.clone(), condition.clone())
24}
25
26pub fn masked_invalid<T: Element + Float, D: Dimension>(
31 data: &Array<T, D>,
32) -> FerrayResult<MaskedArray<T, D>> {
33 let mask_data: Vec<bool> = data.iter().map(|v| v.is_nan() || v.is_infinite()).collect();
34 let mask = Array::from_vec(data.dim().clone(), mask_data)?;
35 MaskedArray::new(data.clone(), mask)
36}
37
38pub fn masked_equal<T: Element + PartialEq + Copy, D: Dimension>(
43 data: &Array<T, D>,
44 value: T,
45) -> FerrayResult<MaskedArray<T, D>> {
46 let mask_data: Vec<bool> = data.iter().map(|v| *v == value).collect();
47 let mask = Array::from_vec(data.dim().clone(), mask_data)?;
48 MaskedArray::new(data.clone(), mask)
49}
50
51pub fn masked_not_equal<T: Element + PartialEq + Copy, D: Dimension>(
56 data: &Array<T, D>,
57 value: T,
58) -> FerrayResult<MaskedArray<T, D>> {
59 let mask_data: Vec<bool> = data.iter().map(|v| *v != value).collect();
60 let mask = Array::from_vec(data.dim().clone(), mask_data)?;
61 MaskedArray::new(data.clone(), mask)
62}
63
64pub fn masked_greater<T: Element + PartialOrd + Copy, D: Dimension>(
69 data: &Array<T, D>,
70 value: T,
71) -> FerrayResult<MaskedArray<T, D>> {
72 let mask_data: Vec<bool> = data.iter().map(|v| *v > value).collect();
73 let mask = Array::from_vec(data.dim().clone(), mask_data)?;
74 MaskedArray::new(data.clone(), mask)
75}
76
77pub fn masked_less<T: Element + PartialOrd + Copy, D: Dimension>(
82 data: &Array<T, D>,
83 value: T,
84) -> FerrayResult<MaskedArray<T, D>> {
85 let mask_data: Vec<bool> = data.iter().map(|v| *v < value).collect();
86 let mask = Array::from_vec(data.dim().clone(), mask_data)?;
87 MaskedArray::new(data.clone(), mask)
88}
89
90pub fn masked_greater_equal<T: Element + PartialOrd + Copy, D: Dimension>(
95 data: &Array<T, D>,
96 value: T,
97) -> FerrayResult<MaskedArray<T, D>> {
98 let mask_data: Vec<bool> = data.iter().map(|v| *v >= value).collect();
99 let mask = Array::from_vec(data.dim().clone(), mask_data)?;
100 MaskedArray::new(data.clone(), mask)
101}
102
103pub fn masked_less_equal<T: Element + PartialOrd + Copy, D: Dimension>(
108 data: &Array<T, D>,
109 value: T,
110) -> FerrayResult<MaskedArray<T, D>> {
111 let mask_data: Vec<bool> = data.iter().map(|v| *v <= value).collect();
112 let mask = Array::from_vec(data.dim().clone(), mask_data)?;
113 MaskedArray::new(data.clone(), mask)
114}
115
116pub fn masked_inside<T: Element + PartialOrd + Copy, D: Dimension>(
121 data: &Array<T, D>,
122 v1: T,
123 v2: T,
124) -> FerrayResult<MaskedArray<T, D>> {
125 let mask_data: Vec<bool> = data.iter().map(|v| *v >= v1 && *v <= v2).collect();
126 let mask = Array::from_vec(data.dim().clone(), mask_data)?;
127 MaskedArray::new(data.clone(), mask)
128}
129
130pub fn masked_outside<T: Element + PartialOrd + Copy, D: Dimension>(
135 data: &Array<T, D>,
136 v1: T,
137 v2: T,
138) -> FerrayResult<MaskedArray<T, D>> {
139 let mask_data: Vec<bool> = data.iter().map(|v| *v < v1 || *v > v2).collect();
140 let mask = Array::from_vec(data.dim().clone(), mask_data)?;
141 MaskedArray::new(data.clone(), mask)
142}