ipython parallels

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
derbernd
User
Beiträge: 13
Registriert: Montag 6. Oktober 2014, 08:19

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 ?
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.
Antworten