Coverage for src/foapy/ma/_alphabet.py: 100%
16 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-17 20:45 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-17 20:45 +0000
1import numpy as np
2import numpy.ma as ma
4from foapy.exceptions import Not1DArrayException
7def alphabet(X) -> np.ma.MaskedArray:
8 """
9 Implementation of ordered set - alphabet of elements.
10 Alphabet is list of all unique elements in particular sequence.
12 Parameters
13 ----------
14 X: masked_array
15 Array to get unique values.
17 Returns
18 -------
19 result: masked_array or Exception.
20 Exception if wrong mask or not d1 array, masked_array otherwise.
22 Examples
23 --------
25 ----1----
26 >>> import foapy.ma as ma
27 >>> a = ['a', 'c', 'c', 'e', 'd', 'a']
28 >>> mask = [0, 0, 0, 1, 0, 0]
29 >>> masked_a = ma.masked_array(a, mask)
30 >>> b = ma.alphabet(masked_a)
31 >>> b
32 ['a' 'c' 'd']
34 ----2----
35 >>> import foapy.ma as ma
36 >>> a = ['a', 'c', 'c', 'e', 'd', 'a']
37 >>> mask = [0, 0, 0, 0, 0, 0]
38 >>> masked_a = ma.masked_array(a, mask)
39 >>> b = ma.alphabet(masked_a)
40 >>> b
41 ['a' 'c' 'e' 'd']
43 ----3----
44 >>> import foapy.ma as ma
45 >>> a = [1, 2, 2, 3, 4, 1]
46 >>> mask = [0, 0, 0, 0, 0, 0]
47 >>> masked_a = ma.masked_array(a, mask)
48 >>> b = ma.alphabet(masked_a)
49 >>> b
50 [1 2 3 4]
52 ----4----
53 >>> import foapy.ma as ma
54 >>> a = []
55 >>> mask = []
56 >>> masked_a = ma.masked_array(a, mask)
57 >>> b = ma.alphabet(masked_a)
58 >>> b
59 []
61 ----5----
62 >>> import foapy.ma as ma
63 >>> a = ['a', 'b', 'c', 'a', 'b', 'c', 'c', 'c', 'b', 'a', 'c', 'b', 'c']
64 >>> mask = [0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0]
65 >>> masked_a = ma.masked_array(a, mask)
66 >>> b = ma.alphabet(masked_a)
67 >>> b
68 ['а' 'c']
70 ----6----
71 >>> import foapy.ma as ma
72 >>> a = ['a', 'b', 'c', 'a', 'b', 'c', 'c', 'c', 'b', 'a', 'c', 'b', 'c']
73 >>> mask = [0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1]
74 >>> masked_a = ma.masked_array(a, mask)
75 >>> b = ma.alphabet(masked_a)
76 >>> b
77 ['а']
79 ----7----
80 >>> import foapy.ma as ma
81 >>> a = ['a', 'b', 'c', 'a', 'b', 'c', 'c', 'c', 'b', 'a', 'c', 'b', 'c']
82 >>> mask = [0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0]
83 >>> masked_a = ma.masked_array(a, mask)
84 >>> b = ma.alphabet(masked_a)
85 >>> b
86 Exception
88 ----8----
89 >>> import foapy.ma as ma
90 >>> a = [[2, 2, 2], [2, 2, 2]]
91 >>> mask = [[0, 0, 0], [0, 0, 0]]
92 >>> masked_a = ma.masked_array(a, mask)
93 >>> b = ma.alphabet(masked_a)
94 >>> b
95 Exception
96 """
98 if X.ndim > 1: # Checking for d1 array
99 raise Not1DArrayException(
100 {"message": f"Incorrect array form. Expected d1 array, exists {X.ndim}"}
101 )
103 mask = ma.getmask(X)
104 perm = X.argsort(kind="mergesort")
106 mask_shape = X.shape
107 unique_mask = np.empty(mask_shape, dtype=bool)
108 unique_mask[:1] = True
109 unique_mask[1:] = X[perm[1:]] != X[perm[:-1]]
110 unique_mask = np.logical_and(unique_mask, ~mask[perm])
112 result_mask = np.full_like(unique_mask, False)
113 result_mask[perm[unique_mask]] = True
114 return X[result_mask]