scipy.ndimage.

center_of_mass#

scipy.ndimage.center_of_mass(input, labels=None, index=None)[source]#

Calculate the center of mass of the values of an array at labels.

Parameters:
inputndarray

Data from which to calculate center-of-mass. The masses can either be positive or negative.

labelsndarray, optional

Labels for objects in input, as generated by ndimage.label. Only used with index. Dimensions must be the same as input.

indexint or sequence of ints, optional

Labels for which to calculate centers-of-mass. If not specified, the combined center of mass of all labels greater than zero will be calculated. Only used with labels.

Returns:
center_of_masstuple, or list of tuples

Coordinates of centers-of-mass.

Notes

Array API Standard Support

center_of_mass has experimental support for Python Array API Standard compatible backends in addition to NumPy. Please consider testing these features by setting an environment variable SCIPY_ARRAY_API=1 and providing CuPy, PyTorch, JAX, or Dask arrays as array arguments. The following combinations of backend and device (or other capability) are supported.

Library

CPU

GPU

NumPy

n/a

CuPy

n/a

PyTorch

JAX

⚠️ no JIT

Dask

⚠️ computes graph

n/a

See Support for the array API standard for more information.

Examples

>>> import numpy as np
>>> a = np.array(([0,0,0,0],
...               [0,1,1,0],
...               [0,1,1,0],
...               [0,1,1,0]))
>>> from scipy import ndimage
>>> ndimage.center_of_mass(a)
(2.0, 1.5)

Calculation of multiple objects in an image

>>> b = np.array(([0,1,1,0],
...               [0,1,0,0],
...               [0,0,0,0],
...               [0,0,1,1],
...               [0,0,1,1]))
>>> lbl = ndimage.label(b)[0]
>>> ndimage.center_of_mass(b, lbl, [1,2])
[(0.33333333333333331, 1.3333333333333333), (3.5, 2.5)]

Negative masses are also accepted, which can occur for example when bias is removed from measured data due to random noise.

>>> c = np.array(([-1,0,0,0],
...               [0,-1,-1,0],
...               [0,1,-1,0],
...               [0,1,1,0]))
>>> ndimage.center_of_mass(c)
(-4.0, 1.0)

If there are division by zero issues, the function does not raise an error but rather issues a RuntimeWarning before returning inf and/or NaN.

>>> d = np.array([-1, 1])
>>> ndimage.center_of_mass(d)
(inf,)