Hi!

On 07/16/2014 10:14 PM, Wolfgang Maier wrote:

careful here: you just stored a tuple instead of a list; doesn't matter
for your current implementation, but may bite you at some point.

Oh, you're right. Silly mistake, even if harmless for the application I have in mind.

         else:
             # x does not belong to any cluster, create a new one
             clusters.append([x,1])
     # return list with centers
     return [center for center, _ in clusters]


Your building of the close_to list with Trues and Falses, then using it
to find the original element again makes me think that you're a regular
R user ? Using such a logical vector (I guess that's what you'd call it
in R) should (almost) never be required in Python.

No, I use mainly python and fortran (but I'm not a "real" programmer). I arrived at this particular function from a previous version which only took one single line and was quite readable, but it didn't compute the centers of the clusters; the first value added to a new cluster would be the cluster value, regardless of other added values. Then I decided that I wanted the centroids of each cluster and this was the result. It smelled bad, but I was trying to hang on to my (supposedly) smart one liner...

Here's an implementation of this idea demonstrating how, in Python, you
typically use the builtin enumerate function to avoid "logical vectors"
or other kinds of index juggling:

def aglomerate(x_lst, delta=1.e-5):
     centers = []
     sizes = []
     for x in x_lst:
         for i, center in enumerate(centers):
             if abs(x - center) < delta:
                 # x is close to a cluster
                 #update the cluster center including the new value,
                 #and increment dimension of cluster
                 n = sizes[i]
                 centers[i] = (n * center + x)/(n+1)
                 sizes[i] = n+1
                 break
         else:
             # this block is executed only when the break in the preceeding
             # block wasn't reached =>
             # x does not belong to any cluster, create a new one
             centers.append(x)
             sizes.append(1)
     # return list with centers
     return centers

Thanks, Wolfgang. You were very helpful.

_______________________________________________
Tutor maillist  -  [email protected]
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to