center_of_mass(input, labels=None, index=None)¶
Calculate the center of mass of the values of an array at labels.
input : ndarray
Data from which to calculate center-of-mass. The masses can either be positive or negative.
labels : ndarray, optional
Labels for objects in input, as generated by ndimage.label. Only used with index. Dimensions must be the same as input.
index : int or sequence of ints, optional
Labels for which to calculate centers-of-mass. If not specified, all labels greater than zero are used. Only used with labels.
center_of_mass : tuple, or list of tuples
Coordinates of centers-of-mass.
>>> a = np.array(([0,0,0,0], ... [0,1,1,0], ... [0,1,1,0], ... [0,1,1,0])) >>> from scipy import ndimage >>> ndimage.measurements.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) >>> ndimage.measurements.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.measurements.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.measurements.center_of_mass(d) (inf,)