grouping array

Fredrik Lundh fredrik at pythonware.com
Thu Sep 29 20:10:29 CEST 2005


pkilambi at gmail.com wrote:

> hi if I have an array
>
> say x = [[2,2,0,0,1,1],
>         [1,1,0,0,1,1],
>         [1,1,0,0,1,1]]
> I basically want to group regions that are non zero like I want to get
> the coordinates of non zero regions..as (x1,y1,x2,y2)
> [(0,0,2,1),(0,4,2,5)] which show the top left(x1,y1) and bottom
> right(x2,y2) corners of each group.hope i am clear.

given your definitions, neither (0, 0, 2, 1) nor (0, 4, 2, 5) are clusters
in your data.  assuming that your description is wrong but your data is
correct, and your clusters are always this simple, here's a snippet that
does what I think you want:

x = [[2,2,0,0,1,1],
     [1,1,0,0,1,1],
     [1,1,0,0,1,1]]

# http://www.pythonware.com/products/pil/
import Image

h = len(x)
w = len(x[0])

data = []
for row in x:
    data.extend(row)

im = Image.new("L", (w, h), None)
im.putdata(data)

def runlength(x):
    out = []
    u = 0
    for i, v in enumerate(x):
        if v:
            if not u:
                lo = i
        elif u:
            out.append((lo, i))
        u = v
    if u: out.append((lo, i+1))
    return out

xx, yy = im.getprojection()

for y in runlength(yy):
    y0, y1 = y
    for x in runlength(xx):
        x0, x1 = x
        print (y0, x0, y1-1, x1-1)

</F> 






More information about the Python-list mailing list