Seite 1 von 1

ipython parallels

Verfasst: Dienstag 28. Oktober 2014, 14:18
von derbernd
Hallo,

ich versuche gerade einen script zu erweitern und eine bestimmte Funktion parallel ausführen zu lassen. Dabei nutze ich iPython parallels
http://ipython.org/ipython-doc/dev/api/ ... .view.html

Jetzt zu meinem Problem. Ich habe die Funktion clusterData(data,k): (kmeans-Clustering eines Vectors in k Cluster) definiert.

Code: Alles auswählen

def clusterData(data, k):
    from scipy.cluster.vq import vq, kmeans, whiten
    import numpy as np
    cent,en = kmeans(data,k)
    idx,_ = vq(data,cent)
    
    return en, cent, idx
Die Rückgabewerte sind:
  • en: double
    cent: 1d-array
    idx = 1d-array
Da ich eine bestimmte menge an Rückgabewerten speichern möchte, habe ich mir eine Klasse definiert.

Code: Alles auswählen

class dataArray:
    def __init__(self,en, cent, idx):
        self.energy = en
        self.centers = cent
        self.assignment = idx
Die Ergebnisse der Clusteranalyse konnte ich mit *.append(dataArray(en,cent,idx) speichern.

Bis hierhin läuft der script auch. Somit habe ich begonnen die Einzelschritte zu modifizieren. Den Aufruf der einzelnen Clusteruntersuchungen starte ich nicht mehr mittels einer for-Schleife sondern mit:

Code: Alles auswählen

res = views.map(clusterData,data,ClusterList)
wobei ClusterList ein Vector mit der Anzahl an zu untersuchenden Clustern (2,3,4,5,6,...)

Wie bekomme ich die gespeicherten Ergebnisse aus res in eine List vom Typ=dataArray ?

Re: ipython parallels

Verfasst: Dienstag 28. Oktober 2014, 15:42
von BlackJack
@derbernd: Entweder muss die Berechnungsfunktion statt eines Tupels schon ein Objekt vom Typ `dataArray` zurück geben, oder Du musst an geeigneter Stelle jedes Element der Ergebnisliste in so ein Objekt verpacken.

Wobei mir der Typ ein wenig komisch vorkommt. Der Name ist unkonventionell und `Array` ist inhaltlich falsch. Falls da keine weiteren Methoden hinzukommen und die Attribute nicht neu zugewiesen werden würde ich ein `collections.namedtuple()` dafür verwenden.

Eine Liste von so einem Typ gibt es auch nicht, in Python kann man alles mögliche, auch gemischt, in eine Liste stecken.

Importe gehören eigentlich nicht *in* Funkionen sondern an den Anfang des Moduls.