pynkowski.stats.extrema
This submodule contains the functions to compute the density distribution (and total number) of local maxima and minima of a field.
1'''This submodule contains the functions to compute the density distribution (and total number) of local maxima and minima of a field.''' 2import numpy as np 3from .utils_st import subsample_us, define_ubins 4from ..data.base_da import DataField 5from ..theory.base_th import TheoryField 6 7try: 8 from tqdm.auto import tqdm 9except: 10 tqdm = lambda x, disable: x 11 print('tqdm not loaded') 12 13def maxima(field, us, edges=False, verbose=True): 14 """Compute the density distribution of maxima and the total number of maxima of a field. 15 16 Parameters 17 ---------- 18 field : DataField or TheoryField 19 Field on which to compute the maxima distribution, which can be a theoretical field or a data field. 20 21 us : np.array 22 The thresholds where the distribution is computed. 23 24 edges : bool, optional 25 If False (default), the given `us` is assumed to be an array of uniformly distributed thresholds, which are taken as the central values of the bins. 26 If True, input `us` is assumed to be a monotonically increasing array of bin edges, including the rightmost edge, allowing for non-uniform distributions of thresholds. 27 In the latter case, the effective thresholds are the central value of the given bins. 28 29 verbose : bool, optional 30 If True (default), progress bars are shown for some computations on data. 31 32 Returns 33 ------- 34 maxima_dist : np.array() 35 The density distribution of the maxima at the given thresholds. 36 37 number_total : float 38 The total number of maxima. 39 40 """ 41 us = np.atleast_1d(us) 42 43 if isinstance(field, TheoryField): 44 us, dus = define_ubins(us, edges) 45 us = subsample_us(us, dus) 46 try: 47 return np.nanmean(field.maxima_dist(us), axis=1), field.maxima_total() 48 except AttributeError: 49 raise NotImplementedError(f"The theoretical expectation of the maxima distribution for {field.name} fields is not implemented. If you know an expression, please get in touch.") 50 51 if isinstance(field, DataField): 52 try: 53 max_list = field.maxima_list() 54 except AttributeError: 55 raise NotImplementedError(f"The computation of the maxima distribution for {field.name} fields is not implemented. If you know a method, please get in touch.") 56 57 if not edges: 58 if us.shape == (1,): 59 du = 0.1 60 else: 61 du = us[1] - us[0] 62 us = np.hstack([us-du/2, us[-1]+du/2]) 63 64 return np.histogram(max_list, bins=us, density=True)[0], max_list.shape[0] 65 66 else: 67 raise TypeError(f"The field must be either TheoryField or DataField (or a subclass).") 68 69def minima(field, us, edges=False, verbose=True): 70 """Compute the density distribution of minima and the total number of minima of a field. 71 72 Parameters 73 ---------- 74 field : DataField or TheoryField 75 Field on which to compute the minima distribution, which can be a theoretical field or a data field. 76 77 us : np.array 78 The thresholds where the distribution is computed. 79 80 edges : bool, optional 81 If False (default), the given `us` is assumed to be an array of uniformly distributed thresholds, which are taken as the central values of the bins. 82 If True, input `us` is assumed to be a monotonically increasing array of bin edges, including the rightmost edge, allowing for non-uniform distributions of thresholds. 83 In the latter case, the effective thresholds are the central value of the given bins. 84 85 verbose : bool, optional 86 If True (default), progress bars are shown for the computations on data. 87 88 Returns 89 ------- 90 minima_dist : np.array() 91 The density distribution of the minima at the given thresholds. 92 93 number_total : float 94 The total number of minima. 95 96 """ 97 us = np.atleast_1d(us) 98 99 if isinstance(field, TheoryField): 100 us, dus = define_ubins(us, edges) 101 us = subsample_us(us, dus) 102 try: 103 return np.nanmean(field.minima_dist(us), axis=1), field.minima_total() 104 except AttributeError: 105 raise NotImplementedError(f"The theoretical expectation of the minima distribution for {field.name} fields is not implemented. If you know an expression, please get in touch.") 106 107 if isinstance(field, DataField): 108 try: 109 min_list = field.minima_list() 110 except AttributeError: 111 raise NotImplementedError(f"The computation of the minima distribution for {field.name} fields is not implemented. If you know a method, please get in touch.") 112 113 if not edges: 114 if us.shape == (1,): 115 du = 0.1 116 else: 117 du = us[1] - us[0] 118 us = np.hstack([us-du/2, us[-1]+du/2]) 119 120 return np.histogram(min_list, bins=us, density=True)[0], min_list.shape[0] 121 122 else: 123 raise TypeError(f"The field must be either TheoryField or DataField (or a subclass).") 124 125 126 127__all__ = ["maxima", "minima"] 128 129__docformat__ = "numpy"
def
maxima(field, us, edges=False, verbose=True):
14def maxima(field, us, edges=False, verbose=True): 15 """Compute the density distribution of maxima and the total number of maxima of a field. 16 17 Parameters 18 ---------- 19 field : DataField or TheoryField 20 Field on which to compute the maxima distribution, which can be a theoretical field or a data field. 21 22 us : np.array 23 The thresholds where the distribution is computed. 24 25 edges : bool, optional 26 If False (default), the given `us` is assumed to be an array of uniformly distributed thresholds, which are taken as the central values of the bins. 27 If True, input `us` is assumed to be a monotonically increasing array of bin edges, including the rightmost edge, allowing for non-uniform distributions of thresholds. 28 In the latter case, the effective thresholds are the central value of the given bins. 29 30 verbose : bool, optional 31 If True (default), progress bars are shown for some computations on data. 32 33 Returns 34 ------- 35 maxima_dist : np.array() 36 The density distribution of the maxima at the given thresholds. 37 38 number_total : float 39 The total number of maxima. 40 41 """ 42 us = np.atleast_1d(us) 43 44 if isinstance(field, TheoryField): 45 us, dus = define_ubins(us, edges) 46 us = subsample_us(us, dus) 47 try: 48 return np.nanmean(field.maxima_dist(us), axis=1), field.maxima_total() 49 except AttributeError: 50 raise NotImplementedError(f"The theoretical expectation of the maxima distribution for {field.name} fields is not implemented. If you know an expression, please get in touch.") 51 52 if isinstance(field, DataField): 53 try: 54 max_list = field.maxima_list() 55 except AttributeError: 56 raise NotImplementedError(f"The computation of the maxima distribution for {field.name} fields is not implemented. If you know a method, please get in touch.") 57 58 if not edges: 59 if us.shape == (1,): 60 du = 0.1 61 else: 62 du = us[1] - us[0] 63 us = np.hstack([us-du/2, us[-1]+du/2]) 64 65 return np.histogram(max_list, bins=us, density=True)[0], max_list.shape[0] 66 67 else: 68 raise TypeError(f"The field must be either TheoryField or DataField (or a subclass).")
Compute the density distribution of maxima and the total number of maxima of a field.
Parameters
- field (DataField or TheoryField): Field on which to compute the maxima distribution, which can be a theoretical field or a data field.
- us (np.array): The thresholds where the distribution is computed.
- edges (bool, optional):
If False (default), the given
usis assumed to be an array of uniformly distributed thresholds, which are taken as the central values of the bins. If True, inputusis assumed to be a monotonically increasing array of bin edges, including the rightmost edge, allowing for non-uniform distributions of thresholds. In the latter case, the effective thresholds are the central value of the given bins. - verbose (bool, optional): If True (default), progress bars are shown for some computations on data.
Returns
- maxima_dist (np.array()): The density distribution of the maxima at the given thresholds.
- number_total (float): The total number of maxima.
def
minima(field, us, edges=False, verbose=True):
70def minima(field, us, edges=False, verbose=True): 71 """Compute the density distribution of minima and the total number of minima of a field. 72 73 Parameters 74 ---------- 75 field : DataField or TheoryField 76 Field on which to compute the minima distribution, which can be a theoretical field or a data field. 77 78 us : np.array 79 The thresholds where the distribution is computed. 80 81 edges : bool, optional 82 If False (default), the given `us` is assumed to be an array of uniformly distributed thresholds, which are taken as the central values of the bins. 83 If True, input `us` is assumed to be a monotonically increasing array of bin edges, including the rightmost edge, allowing for non-uniform distributions of thresholds. 84 In the latter case, the effective thresholds are the central value of the given bins. 85 86 verbose : bool, optional 87 If True (default), progress bars are shown for the computations on data. 88 89 Returns 90 ------- 91 minima_dist : np.array() 92 The density distribution of the minima at the given thresholds. 93 94 number_total : float 95 The total number of minima. 96 97 """ 98 us = np.atleast_1d(us) 99 100 if isinstance(field, TheoryField): 101 us, dus = define_ubins(us, edges) 102 us = subsample_us(us, dus) 103 try: 104 return np.nanmean(field.minima_dist(us), axis=1), field.minima_total() 105 except AttributeError: 106 raise NotImplementedError(f"The theoretical expectation of the minima distribution for {field.name} fields is not implemented. If you know an expression, please get in touch.") 107 108 if isinstance(field, DataField): 109 try: 110 min_list = field.minima_list() 111 except AttributeError: 112 raise NotImplementedError(f"The computation of the minima distribution for {field.name} fields is not implemented. If you know a method, please get in touch.") 113 114 if not edges: 115 if us.shape == (1,): 116 du = 0.1 117 else: 118 du = us[1] - us[0] 119 us = np.hstack([us-du/2, us[-1]+du/2]) 120 121 return np.histogram(min_list, bins=us, density=True)[0], min_list.shape[0] 122 123 else: 124 raise TypeError(f"The field must be either TheoryField or DataField (or a subclass).")
Compute the density distribution of minima and the total number of minima of a field.
Parameters
- field (DataField or TheoryField): Field on which to compute the minima distribution, which can be a theoretical field or a data field.
- us (np.array): The thresholds where the distribution is computed.
- edges (bool, optional):
If False (default), the given
usis assumed to be an array of uniformly distributed thresholds, which are taken as the central values of the bins. If True, inputusis assumed to be a monotonically increasing array of bin edges, including the rightmost edge, allowing for non-uniform distributions of thresholds. In the latter case, the effective thresholds are the central value of the given bins. - verbose (bool, optional): If True (default), progress bars are shown for the computations on data.
Returns
- minima_dist (np.array()): The density distribution of the minima at the given thresholds.
- number_total (float): The total number of minima.