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

1import numpy as np 

2import numpy.ma as ma 

3 

4from foapy.exceptions import Not1DArrayException 

5 

6 

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. 

11 

12 Parameters 

13 ---------- 

14 X: masked_array 

15 Array to get unique values. 

16 

17 Returns 

18 ------- 

19 result: masked_array or Exception. 

20 Exception if wrong mask or not d1 array, masked_array otherwise. 

21 

22 Examples 

23 -------- 

24 

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'] 

33 

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'] 

42 

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] 

51 

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 [] 

60 

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'] 

69 

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 ['а'] 

78 

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 

87 

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 """ 

97 

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 ) 

102 

103 mask = ma.getmask(X) 

104 perm = X.argsort(kind="mergesort") 

105 

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]) 

111 

112 result_mask = np.full_like(unique_mask, False) 

113 result_mask[perm[unique_mask]] = True 

114 return X[result_mask]