Ejemplo n.º 1
0
def blockSums(data, blocks=None, processes=defaultProcesses):
    """Sums of evenly spaced blocks in array
  
  Arguments:
    data : array
      array to perform the block sums on
    blocks : int or None
      number of blocks to split array into
    processes : None or int
      number of processes, if None use number of cpus
    
  Returns:
    array
      sums of the values in the different blocks
  """
    if processes is None:
        processes = defaultProcesses
    if blocks is None:
        blocks = processes * defaultBlocksPerProcess

    d = data.reshape(-1, order='A')
    if data.dtype == bool:
        d = d.view('uint8')

    return code.blockSums1d(d, blocks=blocks, processes=processes)
Ejemplo n.º 2
0
def where(data,
          out=None,
          blocks=None,
          cutoff=defaultCutoff,
          processes=defaultProcesses):
    """Returns the indices of the non-zero entries of the array
  
  Arguments:
    data : array
      array to search for nonzero indices
    out : array or None
      if not None results is written into this array
    blocks : int or None
      number of blocks to split array into for parallel processing
    cutoff : int
      number of elements below whih to switch to numpy.where
    processes : None or int
      number of processes, if None use number of cpus
    
  Returns:
    array
      positions of the nonzero entries of the input array
  
  Note:
    Uses numpy.where if there is no match of dimension implemented!
  """
    if data.ndim != 1 and data.ndim != 3:
        raise Warning('Using numpy where for dimension %d and type %s!' %
                      (data.ndim, data.dtype))
        return np.vstack(np.where(data)).T

    if cutoff is None:
        cutoff = 1
    cutoff = min(1, cutoff)
    if data.size <= cutoff:
        return np.vstack(np.where(data)).T

    if processes is None:
        processes = defaultProcesses
    if blocks is None:
        blocks = processes * defaultBlocksPerProcess

    if data.dtype == bool:
        d = data.view('uint8')
    else:
        d = data

    if out is None:
        if d.ndim == 1:
            sums = code.blockSums1d(d, blocks=blocks, processes=processes)
        else:
            sums = code.blockSums3d(d, blocks=blocks, processes=processes)
        out = np.squeeze(np.zeros((np.sum(sums), data.ndim), dtype=np.int))
    else:
        sums = None

    if d.ndim == 1:
        code.where1d(d, out=out, sums=sums, blocks=blocks, processes=processes)
    else:  # d.ndim == 3:
        code.where3d(d, out=out, sums=sums, blocks=blocks, processes=processes)

    return out