Coverage for src/extratools_core/mathtools.py: 73%
11 statements
« prev ^ index » next coverage.py v7.8.1, created at 2025-05-23 02:47 -0700
« prev ^ index » next coverage.py v7.8.1, created at 2025-05-23 02:47 -0700
1from collections import Counter
2from collections.abc import Iterable
3from math import inf, log2, nan
6def safediv(a: float, b: float) -> float:
7 """
8 Safely divide float even when by 0, by returning either infinity with proper sign or NaN.
10 Parameters
11 ----------
12 a : float
13 b : float
15 Returns
16 -------
17 float
18 Result of `a / b`
19 """
21 if a == b == 0:
22 return nan
24 return inf * a if b == 0 else a / b
27def entropy[T](data: Iterable[T]) -> float:
28 """
29 Compute the entropy of data (as collection of items).
31 Parameters
32 ----------
33 data : float
34 Collection (as `Iterable`) of items
36 Returns
37 -------
38 float
39 Value of entropy
40 """
42 counter: Counter[T] = Counter(data)
43 total: int = sum(counter.values())
45 return -sum(
46 p * log2(p)
47 for p in (
48 curr / total
49 for curr in counter.values()
50 )
51 )