stouputils 1.14.0__py3-none-any.whl → 1.14.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. stouputils/__init__.pyi +15 -0
  2. stouputils/_deprecated.pyi +12 -0
  3. stouputils/all_doctests.pyi +46 -0
  4. stouputils/applications/__init__.pyi +2 -0
  5. stouputils/applications/automatic_docs.py +3 -0
  6. stouputils/applications/automatic_docs.pyi +106 -0
  7. stouputils/applications/upscaler/__init__.pyi +3 -0
  8. stouputils/applications/upscaler/config.pyi +18 -0
  9. stouputils/applications/upscaler/image.pyi +109 -0
  10. stouputils/applications/upscaler/video.pyi +60 -0
  11. stouputils/archive.pyi +67 -0
  12. stouputils/backup.pyi +109 -0
  13. stouputils/collections.pyi +86 -0
  14. stouputils/continuous_delivery/__init__.pyi +5 -0
  15. stouputils/continuous_delivery/cd_utils.pyi +129 -0
  16. stouputils/continuous_delivery/github.pyi +162 -0
  17. stouputils/continuous_delivery/pypi.pyi +52 -0
  18. stouputils/continuous_delivery/pyproject.pyi +67 -0
  19. stouputils/continuous_delivery/stubs.pyi +39 -0
  20. stouputils/ctx.pyi +211 -0
  21. stouputils/data_science/config/get.py +51 -51
  22. stouputils/data_science/data_processing/image/__init__.py +66 -66
  23. stouputils/data_science/data_processing/image/auto_contrast.py +79 -79
  24. stouputils/data_science/data_processing/image/axis_flip.py +58 -58
  25. stouputils/data_science/data_processing/image/bias_field_correction.py +74 -74
  26. stouputils/data_science/data_processing/image/binary_threshold.py +73 -73
  27. stouputils/data_science/data_processing/image/blur.py +59 -59
  28. stouputils/data_science/data_processing/image/brightness.py +54 -54
  29. stouputils/data_science/data_processing/image/canny.py +110 -110
  30. stouputils/data_science/data_processing/image/clahe.py +92 -92
  31. stouputils/data_science/data_processing/image/common.py +30 -30
  32. stouputils/data_science/data_processing/image/contrast.py +53 -53
  33. stouputils/data_science/data_processing/image/curvature_flow_filter.py +74 -74
  34. stouputils/data_science/data_processing/image/denoise.py +378 -378
  35. stouputils/data_science/data_processing/image/histogram_equalization.py +123 -123
  36. stouputils/data_science/data_processing/image/invert.py +64 -64
  37. stouputils/data_science/data_processing/image/laplacian.py +60 -60
  38. stouputils/data_science/data_processing/image/median_blur.py +52 -52
  39. stouputils/data_science/data_processing/image/noise.py +59 -59
  40. stouputils/data_science/data_processing/image/normalize.py +65 -65
  41. stouputils/data_science/data_processing/image/random_erase.py +66 -66
  42. stouputils/data_science/data_processing/image/resize.py +69 -69
  43. stouputils/data_science/data_processing/image/rotation.py +80 -80
  44. stouputils/data_science/data_processing/image/salt_pepper.py +68 -68
  45. stouputils/data_science/data_processing/image/sharpening.py +55 -55
  46. stouputils/data_science/data_processing/image/shearing.py +64 -64
  47. stouputils/data_science/data_processing/image/threshold.py +64 -64
  48. stouputils/data_science/data_processing/image/translation.py +71 -71
  49. stouputils/data_science/data_processing/image/zoom.py +83 -83
  50. stouputils/data_science/data_processing/image_augmentation.py +118 -118
  51. stouputils/data_science/data_processing/image_preprocess.py +183 -183
  52. stouputils/data_science/data_processing/prosthesis_detection.py +359 -359
  53. stouputils/data_science/data_processing/technique.py +481 -481
  54. stouputils/data_science/dataset/__init__.py +45 -45
  55. stouputils/data_science/dataset/dataset.py +292 -292
  56. stouputils/data_science/dataset/dataset_loader.py +135 -135
  57. stouputils/data_science/dataset/grouping_strategy.py +296 -296
  58. stouputils/data_science/dataset/image_loader.py +100 -100
  59. stouputils/data_science/dataset/xy_tuple.py +696 -696
  60. stouputils/data_science/metric_dictionnary.py +106 -106
  61. stouputils/data_science/mlflow_utils.py +206 -206
  62. stouputils/data_science/models/abstract_model.py +149 -149
  63. stouputils/data_science/models/all.py +85 -85
  64. stouputils/data_science/models/keras/all.py +38 -38
  65. stouputils/data_science/models/keras/convnext.py +62 -62
  66. stouputils/data_science/models/keras/densenet.py +50 -50
  67. stouputils/data_science/models/keras/efficientnet.py +60 -60
  68. stouputils/data_science/models/keras/mobilenet.py +56 -56
  69. stouputils/data_science/models/keras/resnet.py +52 -52
  70. stouputils/data_science/models/keras/squeezenet.py +233 -233
  71. stouputils/data_science/models/keras/vgg.py +42 -42
  72. stouputils/data_science/models/keras/xception.py +38 -38
  73. stouputils/data_science/models/keras_utils/callbacks/__init__.py +20 -20
  74. stouputils/data_science/models/keras_utils/callbacks/colored_progress_bar.py +219 -219
  75. stouputils/data_science/models/keras_utils/callbacks/learning_rate_finder.py +148 -148
  76. stouputils/data_science/models/keras_utils/callbacks/model_checkpoint_v2.py +31 -31
  77. stouputils/data_science/models/keras_utils/callbacks/progressive_unfreezing.py +249 -249
  78. stouputils/data_science/models/keras_utils/callbacks/warmup_scheduler.py +66 -66
  79. stouputils/data_science/models/keras_utils/losses/__init__.py +12 -12
  80. stouputils/data_science/models/keras_utils/losses/next_generation_loss.py +56 -56
  81. stouputils/data_science/models/keras_utils/visualizations.py +416 -416
  82. stouputils/data_science/models/sandbox.py +116 -116
  83. stouputils/data_science/range_tuple.py +234 -234
  84. stouputils/data_science/utils.py +285 -285
  85. stouputils/decorators.pyi +242 -0
  86. stouputils/image.pyi +172 -0
  87. stouputils/installer/__init__.py +18 -18
  88. stouputils/installer/__init__.pyi +5 -0
  89. stouputils/installer/common.pyi +39 -0
  90. stouputils/installer/downloader.pyi +24 -0
  91. stouputils/installer/linux.py +144 -144
  92. stouputils/installer/linux.pyi +39 -0
  93. stouputils/installer/main.py +223 -223
  94. stouputils/installer/main.pyi +57 -0
  95. stouputils/installer/windows.py +136 -136
  96. stouputils/installer/windows.pyi +31 -0
  97. stouputils/io.pyi +213 -0
  98. stouputils/parallel.py +13 -10
  99. stouputils/parallel.pyi +211 -0
  100. stouputils/print.pyi +136 -0
  101. stouputils/py.typed +1 -1
  102. stouputils/stouputils/parallel.pyi +4 -4
  103. stouputils/version_pkg.pyi +15 -0
  104. {stouputils-1.14.0.dist-info → stouputils-1.14.1.dist-info}/METADATA +1 -1
  105. stouputils-1.14.1.dist-info/RECORD +171 -0
  106. stouputils-1.14.0.dist-info/RECORD +0 -140
  107. {stouputils-1.14.0.dist-info → stouputils-1.14.1.dist-info}/WHEEL +0 -0
  108. {stouputils-1.14.0.dist-info → stouputils-1.14.1.dist-info}/entry_points.txt +0 -0
@@ -1,234 +1,234 @@
1
- """
2
- This module contains the RangeTuple class, which provides a named tuple for range parameters.
3
-
4
- This class contains methods for:
5
-
6
- - Iterating over range values
7
- - Accessing range values by index
8
- - Slicing range values
9
- - Converting to string representation
10
- """
11
- # pyright: reportUnknownMemberType=false
12
- # pyright: reportUnknownVariableType=false
13
- # pyright: reportIncompatibleMethodOverride=false
14
-
15
- # Imports
16
- from __future__ import annotations
17
-
18
- from collections.abc import Generator
19
- from typing import Any, NamedTuple
20
-
21
- import numpy as np
22
-
23
- from .utils import Utils
24
-
25
-
26
- # Create base tuple class
27
- class _RangeTupleBase(NamedTuple):
28
- """ Base class for RangeTuple """
29
- mini: float | None
30
- """ The minimum value (inclusive) (can be None if default is set) """
31
- maxi: float | None
32
- """ The maximum value (exclusive) (can be None if default is set) """
33
- step: float | None
34
- """ The step value between elements (can be None if default is set) """
35
- default: float | None
36
- """ Optional default value, usually middle of range """
37
-
38
-
39
- # Tuple class for range parameters
40
- class RangeTuple(_RangeTupleBase):
41
- """ A named tuple containing range parameters.
42
-
43
- Attributes:
44
- mini (float): The minimum value (inclusive) (can be None if default is set)
45
- maxi (float): The maximum value (exclusive) (can be None if default is set)
46
- step (float): The step value between elements (can be None if default is set)
47
- default (float|None): Optional default value, usually middle of range
48
-
49
- Examples:
50
- >>> r = RangeTuple(mini=0.0, maxi=1.0, step=0.3)
51
- >>> print(r)
52
- mini=0.0, maxi=1.0, step=0.3, default=None
53
- >>> [int(x*10) for x in r]
54
- [0, 3, 6, 9]
55
- >>> len(r)
56
- 4
57
- >>> r[0]
58
- 0.0
59
- >>> r[100], r[99] # High indexes will bypass the maximum value
60
- (30.0, 29.7)
61
- >>> r[1:3]
62
- [0.3, 0.6]
63
- >>> round(r[-2], 1)
64
- 0.6
65
- >>> r = RangeTuple()
66
- Traceback (most recent call last):
67
- ...
68
- ValueError: RangeTuple parameters must not be None
69
- """
70
- def __new__(
71
- cls,
72
- mini: float | None = None,
73
- maxi: float | None = None,
74
- step: float | None = 1.0,
75
- default: float | None = None
76
- ) -> RangeTuple:
77
- if (mini is None or maxi is None):
78
- if default is None:
79
- raise ValueError("RangeTuple parameters must not be None")
80
- else:
81
- step = None
82
- return super().__new__(cls, mini, maxi, step, default)
83
-
84
- def __str__(self) -> str:
85
- return f"mini={self.mini}, maxi={self.maxi}, step={self.step}, default={self.default}"
86
-
87
- def __repr__(self) -> str:
88
- return f"RangeTuple(mini={self.mini!r}, maxi={self.maxi!r}, step={self.step!r}, default={self.default!r})"
89
-
90
- def __iter__(self) -> Generator[float, Any, Any]:
91
- """ Iterate over the range values.
92
- If the range is not initialized (mini or maxi is None), yield the default value.
93
- Else, yield from np.arange(...)
94
-
95
- Returns:
96
- Iterator[float]: Iterator over the range values
97
-
98
- Examples:
99
- >>> r = RangeTuple(mini=0.0, maxi=1.0, step=0.5)
100
- >>> list(r)
101
- [0.0, 0.5]
102
- >>> r = RangeTuple(default=1.0)
103
- >>> list(r)
104
- [1.0]
105
- """
106
- if self.mini is None or self.maxi is None or self.step is None and self.default is not None:
107
- yield float(self.default) # pyright: ignore [reportArgumentType]
108
- else:
109
- yield from [float(x) for x in np.arange(self.mini, self.maxi, self.step)]
110
-
111
- def __len__(self) -> int:
112
- """ Return the number of values in the range.
113
-
114
- Returns:
115
- int: Number of values in the range
116
-
117
- Examples:
118
- >>> len(RangeTuple(mini=0.0, maxi=1.0, step=0.5))
119
- 3
120
- >>> len(RangeTuple(default=1.0))
121
- 1
122
- """
123
- if self.mini is None or self.maxi is None or self.step is None:
124
- return 1
125
- else:
126
- return int((self.maxi - self.mini) / self.step) + 1
127
-
128
- def __getitem__(self, index: int | slice) -> float | list[float]:
129
- """ Get value(s) at the given index or slice.
130
- If the range is not initialized, return the default value.
131
-
132
- Args:
133
- index (int | slice): Index or slice to get values for
134
- Returns:
135
- float | list[float]: Value(s) at the specified index/slice
136
-
137
- Examples:
138
- >>> r = RangeTuple(mini=0.0, maxi=1.0, step=0.5)
139
- >>> r[0]
140
- 0.0
141
- >>> r[1]
142
- 0.5
143
- >>> r[-1]
144
- 1.0
145
- >>> r[0:2]
146
- [0.0, 0.5]
147
- >>> r = RangeTuple(default=1.0)
148
- >>> r[0]
149
- 1.0
150
- >>> r[1]
151
- 1.0
152
- """
153
- if self.mini is None or self.maxi is None or self.step is None:
154
- if self.default is not None:
155
- return self.default
156
- else:
157
- raise ValueError("RangeTuple is not initialized")
158
- else:
159
- if isinstance(index, slice):
160
- # Handle None values in slice by using defaults
161
- start: int = 0 if index.start is None else index.start
162
- stop: int = len(self) if index.stop is None else index.stop
163
- step: int = 1 if index.step is None else index.step
164
-
165
- return [self.mini + i * self.step for i in range(start, stop, step)]
166
- else:
167
- while index < 0:
168
- index = len(self) + index
169
- return float(self.mini + index * self.step)
170
-
171
- def __mul__(self, other: float) -> RangeTuple:
172
- """ Multiply the range by a factor.
173
-
174
- Args:
175
- other (float): Factor to multiply by
176
- Returns:
177
- RangeTuple: New range with all values multiplied by the factor
178
-
179
- Examples:
180
- >>> r = RangeTuple(mini=1.0, maxi=2.0, step=0.5)
181
- >>> r * 2
182
- RangeTuple(mini=2.0, maxi=4.0, step=1.0, default=None)
183
- >>> r = RangeTuple(default=1.0)
184
- >>> r * 3
185
- RangeTuple(mini=None, maxi=None, step=None, default=3.0)
186
- """
187
- return RangeTuple(
188
- mini=Utils.safe_multiply_none(self.mini, other),
189
- maxi=Utils.safe_multiply_none(self.maxi, other),
190
- step=Utils.safe_multiply_none(self.step, other),
191
- default=Utils.safe_multiply_none(self.default, other)
192
- )
193
-
194
- def __truediv__(self, other: float) -> RangeTuple:
195
- """ Divide the range by a factor.
196
-
197
- Args:
198
- other (float): Factor to divide by
199
- Returns:
200
- RangeTuple: New range with all values divided by the factor
201
-
202
- Examples:
203
- >>> r = RangeTuple(mini=2.0, maxi=4.0, step=1.0)
204
- >>> r / 2
205
- RangeTuple(mini=1.0, maxi=2.0, step=0.5, default=None)
206
- >>> r = RangeTuple(default=6.0)
207
- >>> r / 3
208
- RangeTuple(mini=None, maxi=None, step=None, default=2.0)
209
- """
210
- return RangeTuple(
211
- mini=Utils.safe_divide_none(self.mini, other),
212
- maxi=Utils.safe_divide_none(self.maxi, other),
213
- step=Utils.safe_divide_none(self.step, other),
214
- default=Utils.safe_divide_none(self.default, other)
215
- )
216
-
217
- def random(self) -> float:
218
- """ Return a random value from the range.
219
- If the range is not initialized, return the default value.
220
-
221
- Returns:
222
- float: Random value from the range
223
-
224
- Examples:
225
- >>> r = RangeTuple(mini=0.0, maxi=1.0, step=1.0)
226
- >>> 0.0 <= r.random() <= 1.0
227
- True
228
- >>> r = RangeTuple(default=1.0)
229
- >>> r.random()
230
- 1.0
231
- """
232
- index = np.random.randint(0, len(self))
233
- return self.__getitem__(index) # pyright: ignore [reportReturnType]
234
-
1
+ """
2
+ This module contains the RangeTuple class, which provides a named tuple for range parameters.
3
+
4
+ This class contains methods for:
5
+
6
+ - Iterating over range values
7
+ - Accessing range values by index
8
+ - Slicing range values
9
+ - Converting to string representation
10
+ """
11
+ # pyright: reportUnknownMemberType=false
12
+ # pyright: reportUnknownVariableType=false
13
+ # pyright: reportIncompatibleMethodOverride=false
14
+
15
+ # Imports
16
+ from __future__ import annotations
17
+
18
+ from collections.abc import Generator
19
+ from typing import Any, NamedTuple
20
+
21
+ import numpy as np
22
+
23
+ from .utils import Utils
24
+
25
+
26
+ # Create base tuple class
27
+ class _RangeTupleBase(NamedTuple):
28
+ """ Base class for RangeTuple """
29
+ mini: float | None
30
+ """ The minimum value (inclusive) (can be None if default is set) """
31
+ maxi: float | None
32
+ """ The maximum value (exclusive) (can be None if default is set) """
33
+ step: float | None
34
+ """ The step value between elements (can be None if default is set) """
35
+ default: float | None
36
+ """ Optional default value, usually middle of range """
37
+
38
+
39
+ # Tuple class for range parameters
40
+ class RangeTuple(_RangeTupleBase):
41
+ """ A named tuple containing range parameters.
42
+
43
+ Attributes:
44
+ mini (float): The minimum value (inclusive) (can be None if default is set)
45
+ maxi (float): The maximum value (exclusive) (can be None if default is set)
46
+ step (float): The step value between elements (can be None if default is set)
47
+ default (float|None): Optional default value, usually middle of range
48
+
49
+ Examples:
50
+ >>> r = RangeTuple(mini=0.0, maxi=1.0, step=0.3)
51
+ >>> print(r)
52
+ mini=0.0, maxi=1.0, step=0.3, default=None
53
+ >>> [int(x*10) for x in r]
54
+ [0, 3, 6, 9]
55
+ >>> len(r)
56
+ 4
57
+ >>> r[0]
58
+ 0.0
59
+ >>> r[100], r[99] # High indexes will bypass the maximum value
60
+ (30.0, 29.7)
61
+ >>> r[1:3]
62
+ [0.3, 0.6]
63
+ >>> round(r[-2], 1)
64
+ 0.6
65
+ >>> r = RangeTuple()
66
+ Traceback (most recent call last):
67
+ ...
68
+ ValueError: RangeTuple parameters must not be None
69
+ """
70
+ def __new__(
71
+ cls,
72
+ mini: float | None = None,
73
+ maxi: float | None = None,
74
+ step: float | None = 1.0,
75
+ default: float | None = None
76
+ ) -> RangeTuple:
77
+ if (mini is None or maxi is None):
78
+ if default is None:
79
+ raise ValueError("RangeTuple parameters must not be None")
80
+ else:
81
+ step = None
82
+ return super().__new__(cls, mini, maxi, step, default)
83
+
84
+ def __str__(self) -> str:
85
+ return f"mini={self.mini}, maxi={self.maxi}, step={self.step}, default={self.default}"
86
+
87
+ def __repr__(self) -> str:
88
+ return f"RangeTuple(mini={self.mini!r}, maxi={self.maxi!r}, step={self.step!r}, default={self.default!r})"
89
+
90
+ def __iter__(self) -> Generator[float, Any, Any]:
91
+ """ Iterate over the range values.
92
+ If the range is not initialized (mini or maxi is None), yield the default value.
93
+ Else, yield from np.arange(...)
94
+
95
+ Returns:
96
+ Iterator[float]: Iterator over the range values
97
+
98
+ Examples:
99
+ >>> r = RangeTuple(mini=0.0, maxi=1.0, step=0.5)
100
+ >>> list(r)
101
+ [0.0, 0.5]
102
+ >>> r = RangeTuple(default=1.0)
103
+ >>> list(r)
104
+ [1.0]
105
+ """
106
+ if self.mini is None or self.maxi is None or self.step is None and self.default is not None:
107
+ yield float(self.default) # pyright: ignore [reportArgumentType]
108
+ else:
109
+ yield from [float(x) for x in np.arange(self.mini, self.maxi, self.step)]
110
+
111
+ def __len__(self) -> int:
112
+ """ Return the number of values in the range.
113
+
114
+ Returns:
115
+ int: Number of values in the range
116
+
117
+ Examples:
118
+ >>> len(RangeTuple(mini=0.0, maxi=1.0, step=0.5))
119
+ 3
120
+ >>> len(RangeTuple(default=1.0))
121
+ 1
122
+ """
123
+ if self.mini is None or self.maxi is None or self.step is None:
124
+ return 1
125
+ else:
126
+ return int((self.maxi - self.mini) / self.step) + 1
127
+
128
+ def __getitem__(self, index: int | slice) -> float | list[float]:
129
+ """ Get value(s) at the given index or slice.
130
+ If the range is not initialized, return the default value.
131
+
132
+ Args:
133
+ index (int | slice): Index or slice to get values for
134
+ Returns:
135
+ float | list[float]: Value(s) at the specified index/slice
136
+
137
+ Examples:
138
+ >>> r = RangeTuple(mini=0.0, maxi=1.0, step=0.5)
139
+ >>> r[0]
140
+ 0.0
141
+ >>> r[1]
142
+ 0.5
143
+ >>> r[-1]
144
+ 1.0
145
+ >>> r[0:2]
146
+ [0.0, 0.5]
147
+ >>> r = RangeTuple(default=1.0)
148
+ >>> r[0]
149
+ 1.0
150
+ >>> r[1]
151
+ 1.0
152
+ """
153
+ if self.mini is None or self.maxi is None or self.step is None:
154
+ if self.default is not None:
155
+ return self.default
156
+ else:
157
+ raise ValueError("RangeTuple is not initialized")
158
+ else:
159
+ if isinstance(index, slice):
160
+ # Handle None values in slice by using defaults
161
+ start: int = 0 if index.start is None else index.start
162
+ stop: int = len(self) if index.stop is None else index.stop
163
+ step: int = 1 if index.step is None else index.step
164
+
165
+ return [self.mini + i * self.step for i in range(start, stop, step)]
166
+ else:
167
+ while index < 0:
168
+ index = len(self) + index
169
+ return float(self.mini + index * self.step)
170
+
171
+ def __mul__(self, other: float) -> RangeTuple:
172
+ """ Multiply the range by a factor.
173
+
174
+ Args:
175
+ other (float): Factor to multiply by
176
+ Returns:
177
+ RangeTuple: New range with all values multiplied by the factor
178
+
179
+ Examples:
180
+ >>> r = RangeTuple(mini=1.0, maxi=2.0, step=0.5)
181
+ >>> r * 2
182
+ RangeTuple(mini=2.0, maxi=4.0, step=1.0, default=None)
183
+ >>> r = RangeTuple(default=1.0)
184
+ >>> r * 3
185
+ RangeTuple(mini=None, maxi=None, step=None, default=3.0)
186
+ """
187
+ return RangeTuple(
188
+ mini=Utils.safe_multiply_none(self.mini, other),
189
+ maxi=Utils.safe_multiply_none(self.maxi, other),
190
+ step=Utils.safe_multiply_none(self.step, other),
191
+ default=Utils.safe_multiply_none(self.default, other)
192
+ )
193
+
194
+ def __truediv__(self, other: float) -> RangeTuple:
195
+ """ Divide the range by a factor.
196
+
197
+ Args:
198
+ other (float): Factor to divide by
199
+ Returns:
200
+ RangeTuple: New range with all values divided by the factor
201
+
202
+ Examples:
203
+ >>> r = RangeTuple(mini=2.0, maxi=4.0, step=1.0)
204
+ >>> r / 2
205
+ RangeTuple(mini=1.0, maxi=2.0, step=0.5, default=None)
206
+ >>> r = RangeTuple(default=6.0)
207
+ >>> r / 3
208
+ RangeTuple(mini=None, maxi=None, step=None, default=2.0)
209
+ """
210
+ return RangeTuple(
211
+ mini=Utils.safe_divide_none(self.mini, other),
212
+ maxi=Utils.safe_divide_none(self.maxi, other),
213
+ step=Utils.safe_divide_none(self.step, other),
214
+ default=Utils.safe_divide_none(self.default, other)
215
+ )
216
+
217
+ def random(self) -> float:
218
+ """ Return a random value from the range.
219
+ If the range is not initialized, return the default value.
220
+
221
+ Returns:
222
+ float: Random value from the range
223
+
224
+ Examples:
225
+ >>> r = RangeTuple(mini=0.0, maxi=1.0, step=1.0)
226
+ >>> 0.0 <= r.random() <= 1.0
227
+ True
228
+ >>> r = RangeTuple(default=1.0)
229
+ >>> r.random()
230
+ 1.0
231
+ """
232
+ index = np.random.randint(0, len(self))
233
+ return self.__getitem__(index) # pyright: ignore [reportReturnType]
234
+