def random(cls, Alphabet, diags=None): """Makes random Q-matrix with specified diag elements and size. diags can be a single float, or vector of values with same number of chars as individual alphabet (e.g. list of 4 elements will act as elements for the 4 bases). """ shape = Alphabet.Shape single_size = shape[0] if diags is None: diags = -randarray(single_size) else: diags = array(diags, 'd') #handle scalar case if not diags.shape: diags = reshape(diags, (1,)) if len(diags) == 1: diags = repeat(diags, single_size) temp = randarray((single_size, single_size-1)) temp *= ((-diags)/sum(temp, 1))[:,NewAxis] result = diag(diags) for r, row in enumerate(temp): result[r][:r] = row[:r] result[r][r+1:] = row[r:] return cls(result, Alphabet)
def random(cls, Alphabet, diags=None): """Makes random Q-matrix with specified diag elements and size. diags can be a single float, or vector of values with same number of chars as individual alphabet (e.g. list of 4 elements will act as elements for the 4 bases). """ shape = Alphabet.Shape single_size = shape[0] if diags is None: diags = -randarray(single_size) else: diags = array(diags, 'd') #handle scalar case if not diags.shape: diags = reshape(diags, (1, )) if len(diags) == 1: diags = repeat(diags, single_size) temp = randarray((single_size, single_size - 1)) temp *= ((-diags) / sum(temp, 1))[:, NewAxis] result = diag(diags) for r, row in enumerate(temp): result[r][:r] = row[:r] result[r][r + 1:] = row[r:] return cls(result, Alphabet)
def mutate(self, seq, random_vector=None): """Returns mutated version of seq, according to self. seq should behave like a Numeric array. random_vector should be vector of 0 and 1 of same length as sequence, if supplied. Result is always an array, not coerced into seq's class. """ sums = cumsum(self._data, 1) model = take(sums, seq, axis=0) if random_vector is None: random_vector = randarray(seq.shape) return sum(transpose(model)[:-1] < random_vector, axis=0)
def randomIndices(self, length, random_vector=None): """Produces random indices according to symbol freqs.""" freqs = cumsum(self._data/sum(self._data))[:-1] if random_vector is None: random_vector=randarray(length) return searchsorted(freqs, random_vector)
def randomIndices(self, length, random_vector=None): """Produces random indices according to symbol freqs.""" freqs = cumsum(self._data / sum(self._data))[:-1] if random_vector is None: random_vector = randarray(length) return searchsorted(freqs, random_vector)