import numpy as np from scipy.stats import gaussian_kde def shorten_species(name): genus, species = name.split('_') return genus[0] + '. ' + species def unsort_unique(array): values, inds = np.unique(array, return_index=True) return values[np.argsort(inds)] def get_kde(data, sigma, axis=None, n=1000, pad=10): if axis is None: axis = np.linspace(data.min() - pad * sigma, data.max() + pad * sigma, n) pdf = gaussian_kde(data, sigma)(axis) return pdf, axis def get_saturation(sigmoid, low=0.05, high=0.95, first=True, last=True, condense=None): if condense == 'norm' and sigmoid.ndim == 2: sigmoid = np.linalg.norm(sigmoid, axis=1) min_value = sigmoid[0] if first else sigmoid.min(axis=0) max_value = sigmoid[-1] if last else sigmoid.max(axis=0) span = max_value - min_value low_value = min_value + low * span high_value = min_value + high * span low_mask = sigmoid <= low_value high_mask = sigmoid <= high_value if sigmoid.ndim == 1: low_ind = np.nonzero(low_mask)[0][-1] high_ind = np.nonzero(high_mask)[0][-1] elif condense == 'all': low_ind = np.nonzero(low_mask.all(axis=1))[0][-1] high_ind = np.nonzero(high_mask.all(axis=1))[0][-1] else: low_ind, high_ind = [], [] for i in range(sigmoid.shape[1]): low_ind.append(np.nonzero(low_mask[:, i])[0][-1]) high_ind.append(np.nonzero(high_mask[:, i])[0][-1]) return low_ind, high_ind