Source code for maidenhair.filters.relative

#!/usr/bin/env python
"""
Relative filter module

"""
__author__ = 'Alisue (lambdalisue@hashnote.net)'
import numpy as np


[docs]def relative(dataset, ori=0, column=1, fail_silently=True): """ Convert dataset to relative value from the value of :attr:`ori` Parameters ---------- dataset : list of numpy array list A list of numpy array list ori : integer or numpy array, optional A relative original data index or numpy array column : integer, optional An index of base column to calculate the relative value fail_silently : boolean If `True`, do not raise exception if no data exists Returns ------- ndarray A list of numpy array list Examples -------- >>> import numpy as np >>> from maidenhair.filters.relative import relative >>> dataset = [] >>> dataset.append([np.array([0, 1, 2]), np.array([3, 4, 5])]) >>> dataset.append([np.array([0, 1, 2]), np.array([3, 5, 7])]) >>> dataset.append([np.array([0, 1, 2]), np.array([100, 103, 106])]) >>> expected = [ ... [np.array([0, 1, 2]), np.array([0, 50, 100])], ... [np.array([0, 1, 2]), np.array([0, 100, 200])], ... [np.array([0, 1, 2]), np.array([4850, 5000, 5150])], ... ] >>> proceed = relative(dataset) >>> np.array_equal(proceed, expected) True """ try: if isinstance(ori, int): # relative from the [ori]th array ori = dataset[ori][column] if isinstance(ori[0], (list, tuple, np.ndarray)): # calculate min/max difference for i in range(len(ori[0])): orimin = np.min(ori[:,i]) orimax = np.max(ori[:,i]) oridiff = orimax - orimin # baseline for data in dataset: data[column][:,i] -= orimin # convert for data in dataset: data[column][:,i] /= oridiff / 100.0 else: orimin = np.min(ori) orimax = np.max(ori) oridiff = orimax - orimin # baseline for data in dataset: data[column] -= orimin # convert for data in dataset: data[column] /= oridiff / 100.0 return dataset except IndexError, e: if fail_silently: # fail silently return dataset raise e
if __name__ == '__main__': import doctest; doctest.testmod()