Hi,

my question is how I can find the centroid of group of cells that share the same value. Say I have this:

``````grid = [[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 0, 0],
[0, 1, 1, 1, 0],
[0, 0, 0 ,0, 0]]``````

I need to get the centroid in x and y = (1.875, 2)

I tried to iterate over all values and when this is 1 store all the x and y coordinates but im stucked as how to actually get the centroid of these points.

## Recommended Answers

You mean the center of mass?

Well, do it like the physicists do: Sum(moments) / Sum(masses):

``````>>> def findCOM(grid):
Mx = 0
My = 0
mass = 0

for i in range(len(grid)):
for j in range(len(grid[i])):
if grid[i][j]:
Mx += j
My += i
mass += …``````

## All 2 Replies

You mean the center of mass?

Well, do it like the physicists do: Sum(moments) / Sum(masses):

``````>>> def findCOM(grid):
Mx = 0
My = 0
mass = 0

for i in range(len(grid)):
for j in range(len(grid[i])):
if grid[i][j]:
Mx += j
My += i
mass += 1
COM = (float(Mx)/mass , float(My)/mass)
return COM

>>> grid = [[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 0, 0],
[0, 1, 1, 1, 0],
[0, 0, 0 ,0, 0]]

>>> findCOM(grid)
(1.875, 2.0)
>>>``````

Jeff

You could just take the average using pylab:

>>> import pylab

>>> grid = pylab.array[[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 0, 0],
[0, 1, 1, 1, 0],
[0, 0, 0 ,0, 0]]

>>> ( pylab.average(pylab.array(grid.nonzero())[1,:]), pylab.average(pylab.array(grid.nonzero())[0,:]) )
(1.875, 2.0)

Be a part of the DaniWeb community

We're a friendly, industry-focused community of 1.20 million developers, IT pros, digital marketers, and technology enthusiasts learning and sharing knowledge.