2010-02-28 14 views
20

Ich erstelle ein numpy Array, das mit Objekten einer bestimmten Klasse gefüllt werden soll, die ich gemacht habe. Ich möchte das Array so initialisieren, dass es immer nur Objekte dieser Klasse enthält. Zum Beispiel, hier ist, was ich tun möchte, und was passiert, wenn ich es tue.Benutzerdefinierte Datentypen in numply Arrays

class Kernel: 
    pass 

>>> L = np.empty(4,dtype=Kernel) 

TypeError: data type not understood 

Ich kann dies tun:

>>> L = np.empty(4,dtype=object) 

und dann jedes Element der L als Kernel Objekt zuweisen (oder jede andere Art von Objekt). Es wäre so nett, wenn ich in der Lage wäre, ein Array von Kernel s zu haben, sowohl vom Standpunkt der Programmierung (Typprüfung) als auch von einem mathematischen (Operationen an Sätzen von Funktionen).

Gibt es eine Möglichkeit für mich, den Datentyp eines numpy Array mit einer beliebigen Klasse anzugeben?

Antwort

18

Wenn Ihre Kernel-Klasse eine vorhersehbare Menge an Mitgliedsdaten aufweist, können Sie anstelle einer Klasse einen dtype für diese Klasse definieren. z.B. wenn es um 9 Schwimmer und einen int parametrisiert ist, könnten Sie tun

kerneldt = np.dtype([('myintname', np.int32), ('myfloats', np.float64, 9)]) 
arr = np.empty(dims, dtype=kerneldt) 

Sie werden einige Zwang zu tun haben, um sie in Objekte der Klasse Kernel zu machen jedes Mal, wenn Sie Methoden eines einzelnen Kernel manipulieren wollen, aber das ist ein Möglichkeit, die tatsächlichen Daten in einem NumPy-Array zu speichern. Wenn Sie nur einen Verweis speichern möchten, ist das Objekt dtype das Beste, was Sie tun können, ohne ndarray abzulagern.

+0

Dies ist, was ich gesucht habe! Obwohl ich anfange zu denken, dass es viel mehr Arbeit ist, als es wert ist ... Wird np.dtype nachlesen. –

1

Soweit ich weiß, einen einzigen Typ für Elemente bei der Durchsetzung a numpy.darray muss manuell ausgeführt werden (es sei denn, das Array enthält Numpy-Skalare): Es gibt keinen integrierten Prüfmechanismus (Ihr Array hat dtype = object). Wenn Sie wirklich einen einzelnen Typ erzwingen möchten, müssen Sie die Klasse ndarray untergliedern und die Prüfungen in den entsprechenden Methoden implementieren (__setitem__, usw.).

Wenn Sie Operationen für eine Reihe von Funktionen (Kernel-Objekte) implementieren möchten, können Sie dies möglicherweise tun, indem Sie die richtigen Operationen direkt in Ihrer Kernel-Klasse definieren. Dies ist, was ich für meine uncertainties.py Modul, die numpy.darrays von Zahlen mit Unsicherheiten behandelt.

Verwandte Themen