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