Coverage for src/extratools_core/mathtools.py: 73%

11 statements  

« prev     ^ index     » next       coverage.py v7.8.1, created at 2025-05-22 04:16 -0700

1from collections import Counter 

2from collections.abc import Iterable 

3from math import inf, log2, nan 

4 

5 

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. 

9 

10 Parameters 

11 ---------- 

12 a : float 

13 b : float 

14 

15 Returns 

16 ------- 

17 float 

18 Result of `a / b` 

19 """ 

20 

21 if a == b == 0: 

22 return nan 

23 

24 return inf * a if b == 0 else a / b 

25 

26 

27def entropy[T](data: Iterable[T]) -> float: 

28 """ 

29 Compute the entropy of data (as collection of items). 

30 

31 Parameters 

32 ---------- 

33 data : float 

34 Collection (as `Iterable`) of items 

35 

36 Returns 

37 ------- 

38 float 

39 Value of entropy 

40 """ 

41 

42 counter: Counter[T] = Counter(data) 

43 total: int = sum(counter.values()) 

44 

45 return -sum( 

46 p * log2(p) 

47 for p in ( 

48 curr / total 

49 for curr in counter.values() 

50 ) 

51 )