porepy.utils.accumarray module
- accum(accmap, a, func=None, size=None, fill_value=0, dtype=None)[source]
An accumulation function similar to Matlab’s accumarray function.
Parameters
- accmapndarray
This is the “accumulation map”. It maps input (i.e. indices into a) to their destination in the output array. The first a.ndim dimensions of accmap must be the same as a.shape. That is, accmap.shape[:a.ndim] must equal a.shape. For example, if a has shape (15,4), then accmap.shape[:2] must equal (15,4). In this case accmap[i,j] gives the index into the output array where element (i,j) of a is to be accumulated. If the output is, say, a 2D, then accmap must have shape (15,4,2). The value in the last dimension give indices into the output array. If the output is 1D, then the shape of accmap can be either (15,4) or (15,4,1)
- andarray
The input data to be accumulated.
- funccallable or None
The accumulation function. The function will be passed a list of values from a to be accumulated. If None, numpy.sum is assumed.
- sizendarray or None
The size of the output array. If None, the size will be determined from accmap.
- fill_valuescalar
The default value for elements of the output array.
- dtypenumpy data type, or None
The data type of the output array. If None, the data type of a is used.
Returns
- outndarray
The accumulated results.
The shape of out is size if size is given. Otherwise, the shape is determined by the (lexicographically) largest indices of the output found in accmap.
Examples
>>> from numpy import array, prod >>> a = array([[1,2,3],[4,-1,6],[-1,8,9]]) >>> a array([[ 1, 2, 3], [ 4, -1, 6], [-1, 8, 9]]) >>> # Sum the diagonals. >>> accmap = array([[0,1,2],[2,0,1],[1,2,0]]) >>> s = accum(accmap, a) array([9, 7, 15]) >>> # A 2D output, from sub-arrays with shapes and positions like this: >>> # [ (2,2) (2,1)] >>> # [ (1,2) (1,1)] >>> accmap = array([ [[0,0],[0,0],[0,1]], [[0,0],[0,0],[0,1]], [[1,0],[1,0],[1,1]], ]) >>> # Accumulate using a product. >>> accum(accmap, a, func=prod, dtype=float) array([[ -8., 18.], [ -8., 9.]]) >>> # Same accmap, but create an array of lists of values. >>> accum(accmap, a, func=lambda x: x, dtype='O') array([[[1, 2, 4, -1], [3, 6]], [[-1, 8], [9]]], dtype=object)