Nelly
Nelly

Reputation: 81

How can i find the coordinates of distinct values?

[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 1 1 1 0 0 0 0 0 1 1 0 0 3 3 0 0 0 4 4 0 0 0 5 5 5 5 0 0 2 2 2 2 2 0 2 2 2 2 2 0 0 0 6 6 6 6 6 6 0 6 6 6 6]
 [0 1 1 0 0 0 0 0 0 0 0 0 0 3 3 0 0 0 4 4 0 0 5 5 5 5 5 5 0 2 2 2 2 2 2 2 2 2 2 2 2 0 0 6 6 6 6 6 6 6 6 6 6 6]
 [1 1 1 0 0 0 0 0 0 0 0 0 0 3 3 0 0 0 4 4 0 5 5 5 0 0 5 5 5 0 2 2 0 0 2 2 0 0 0 2 2 0 0 6 6 0 0 6 6 6 0 0 6 6]
 [1 1 1 0 0 0 0 0 0 0 0 0 0 3 3 0 0 0 4 4 0 5 5 5 5 0 0 0 0 0 2 2 0 2 2 2 0 0 0 2 2 2 0 6 6 0 0 0 6 6 0 0 6 6]
 [1 1 1 0 0 0 0 0 0 0 0 0 0 3 3 0 0 0 4 4 0 0 5 5 5 5 5 5 0 0 2 2 0 2 2 2 0 0 0 2 2 2 0 6 6 0 0 0 6 6 0 0 6 6]
 [0 1 1 0 0 0 0 0 0 7 0 0 0 3 3 0 0 0 4 4 0 0 0 0 5 5 5 5 5 0 2 2 0 2 2 2 0 0 0 2 2 2 0 6 6 0 0 0 6 6 0 0 6 6]]

The following is a connected components list of lists (50 x 10), let's call it labels , what i want is to create a dictionary where the numbers except 0 are a key of that dictionary, and the value correspondent to that key should be the coordinates for example [xmin,xmax,ymin,ymax],

Let's take 1 for example:

{'1': [0,10,1,9], '2': [......} 

Being new to python, I found it hard to write a program to do that from scratch (not the dictionary creation and filling but finding the coordinates). Is there a way inside numpy that can do that for example np.unique(labels) would help me identify unique labels values.

Upvotes: 1

Views: 202

Answers (1)

koPytok
koPytok

Reputation: 3733

You need to use np.where. It returns two arrays:
- the first contains row indeces y
- the second contains column indeces x.

import nupmy as np

arr = np.array(labels)

stats = dict()
for i in np.unique(arr):
    if i == 0:
        continue
    else:
        wh = np.where(arr == i)
        stats[i] = [wh[1].min(), wh[1].max(), wh[0].min(), wh[0].max()]

> {1: [0, 10, 1, 9],
   2: [29, 41, 2, 9],
   3: [13, 14, 4, 9],
   4: [18, 19, 4, 9],
   5: [21, 28, 4, 9],
   6: [43, 53, 4, 9],
   7: [9, 9, 9, 9]}

Upvotes: 3

Related Questions