scipy.ndimage.labeled_comprehension

scipy.ndimage.labeled_comprehension(input, labels, index, func, out_dtype, default, pass_positions=False)[source]

Roughly equivalent to [func(input[labels == i]) for i in index].

Sequentially applies an arbitrary function (that works on array_like input) to subsets of an N-D image array specified by labels and index. The option exists to provide the function with positional parameters as the second argument.

Parameters
inputarray_like

Data from which to select labels to process.

labelsarray_like or None

Labels to objects in input. If not None, array must be same shape as input. If None, func is applied to raveled input.

indexint, sequence of ints or None

Subset of labels to which to apply func. If a scalar, a single value is returned. If None, func is applied to all non-zero values of labels.

funccallable

Python function to apply to labels from input.

out_dtypedtype

Dtype to use for result.

defaultint, float or None

Default return value when a element of index does not exist in labels.

pass_positionsbool, optional

If True, pass linear indices to func as a second argument. Default is False.

Returns
resultndarray

Result of applying func to each of labels to input in index.

Examples

>>> a = np.array([[1, 2, 0, 0],
...               [5, 3, 0, 4],
...               [0, 0, 0, 7],
...               [9, 3, 0, 0]])
>>> from scipy import ndimage
>>> lbl, nlbl = ndimage.label(a)
>>> lbls = np.arange(1, nlbl+1)
>>> ndimage.labeled_comprehension(a, lbl, lbls, np.mean, float, 0)
array([ 2.75,  5.5 ,  6.  ])

Falling back to default:

>>> lbls = np.arange(1, nlbl+2)
>>> ndimage.labeled_comprehension(a, lbl, lbls, np.mean, float, -1)
array([ 2.75,  5.5 ,  6.  , -1.  ])

Passing positions:

>>> def fn(val, pos):
...     print("fn says: %s : %s" % (val, pos))
...     return (val.sum()) if (pos.sum() % 2 == 0) else (-val.sum())
...
>>> ndimage.labeled_comprehension(a, lbl, lbls, fn, float, 0, True)
fn says: [1 2 5 3] : [0 1 4 5]
fn says: [4 7] : [ 7 11]
fn says: [9 3] : [12 13]
array([ 11.,  11., -12.,   0.])