# Index Error

Dave Angel d at davea.name
Tue Nov 20 15:12:01 CET 2012

```On 11/20/2012 08:43 AM, inshu chauhan wrote:
> def distance(c, p):
>     dist = sqrt(
>             ((c[0]-p[0])**2) +
>             ((c[1]-p[1])**2) +
>             ((c[2]-p[2])**2)
>             )
>     return dist
>
>
> def GenerateRing(x,y, N): Generates square rings around a point in data
> which has 300 columns(x) and 3000 rows(y)
>     indices = []
>     for i in xrange(-N, N):
>         indices.append((x+i, y-N))
>         indices.append((x+N, y+i))
>         indices.append((x-i, y+N))
>         indices.append((x-N, y-i))
>     return indices
>
Is it possible that N is greater than either x or y ?  Are negative
subscripts permissible?

You should consider doing the clipping logic in this function, perhaps
by passing xlimit and ylimit in as arguments.

>
> def ComputeClasses(data):
>     points = []
>     for cy in xrange(0, data.height):
>         for cx in xrange(0, data.width):
>
>             if data[cy,cx] == (0.0,0.0,0.0):
>                 continue
>             else :
>                 centre = data[cy, cx]
>                 points.append(centre)
>
>
>             change = True
>
>             while change:
>
>                 for ring_number in xrange(1, 100):
>                     change = False
>                     new_indices = GenerateRing(cx, cy, ring_number)
>                     print new_indices
>                     for idx in new_indices:
>      I need help in this part as I am unable to device a method in
> which if the
> points are out of index,it should stop and
>                         if idx[0] >= 300 and idx[1] >= 3000:           go
> to next centre and start generating rings from there.. and again if the
> index is out of range .. this should repeat

This is where you're trying to clip the values that may be outside of
the total matrix.

You do not want "and" in that expression.  The way you've coded it,
it'll only skip items in which both indices are out of range.  Change it to
if idx[0] >= data.width or idx[1] >= data.height:

and depending on your answer to my earlier query, you may want to also
check if either subscript is negative.

>                             continue
>                         else :
>                             point = data[idx[0], idx[1]]
>                             if point == (0.0, 0.0, 0.0 ):
>                                 print point
>                                 continue
>                             else:
>                                 dist = distance(centre, point)
>                                 print dist
>                                 if  dist < radius :               and rings
> should be added only when this condition is satisfied
>                                     print point
>                                     points.append(point)
>                                     change = True
>                                     print change
>
>
>                         break

Why do you want to terminate the loop after only iteration?

>
>
>             print points
>
>
> ERROR now :
>
> [(296, 403), (298, 403), (298, 405), (296, 405), (297, 403), (298, 404),
> (297, 405), (296, 404)] ... I am printing Indices to know what index it
> dies out..
>
> Traceback (most recent call last):
>   File "Z:/modules/Classify.py", line 73, in <module>
>     ComputeClasses(data)
>   File "Z:/modules/Classify.py", line 49, in ComputeClasses
>     point = data[idx[0], idx[1]]
> error: index is out of range
>

--

DaveA
```