Es gibt Beispiele für here mit C benutzerdefinierten numpy dtypes erstellen:Wie ein benutzerdefinierten erstellen numpy mit cython dtype
Zusätzlich ist es seems to be possible zu erstellen individuelle ufuncs in cython:
Es scheint, wie es auch sein sollte möglich, einen dtype mit Cython zu erstellen (und dann benutzerdefinierte ufuncs dafür zu erstellen). Ist es möglich? Wenn ja, können Sie ein Beispiel veröffentlichen?
USE CASE:
Ich möchte einige Überlebensanalyse zu tun. Die grundlegenden Datenelemente sind Überlebenszeiten (Gleitkommazahlen) mit zugeordneten Zensorwerten (Falsch, wenn die zugehörige Zeit eine Fehlerzeit darstellt, und Wahr, wenn sie stattdessen eine Zensierungszeit darstellt (d. H. Kein Fehler trat während des Beobachtungszeitraums auf)).
Offensichtlich könnte ich einfach zwei numpy Arrays verwenden, um diese Werte zu speichern: ein Float-Array für die Zeiten und ein Bool-Array für die Zensor-Werte. Ich möchte jedoch auf die Möglichkeit hinweisen, dass ein Ereignis mehrere Male auftritt (dies ist ein gutes Modell für beispielsweise Herzinfarkte - Sie können mehrere haben). In diesem Fall brauche ich ein Array von Objekten, die ich MultiEvent
s rufe. Jede MultiEvent
enthält eine Folge von Floats (unzensierte Fehlerzeiten) und eine Beobachtungsperiode (auch Float). Beachten Sie, dass die Anzahl der Fehler nicht für alle MultiEvent
s gleich ist.
Ich muss in der Lage, ein paar Operationen auf einer Reihe von MultiEvent
s auszuführen:
Erhalten Sie die Anzahl der Fehler für jeden
die zensierte Zeit Brauchen Sie (das ist der Zeitraum von Beobachtung minus der Summe aller Fehlerzeiten)
Berechnen Sie eine Log-Likelihood basierend auf zusätzlichen Parameterarrays (z. B. einem Array von Gefahrenwerten). Zum Beispiel wäre das Log-Likelihood für einen einzelnen
MultiEvent
M
und konstanten Gefahrenwerth
so etwas wie:sum(log(h) + h*t for t in M.times) - h*(M.period - sum(M.times))
wo M.times
die Liste (Array, was auch immer) von Ausfallzeiten und M.period
ist die Gesamtbeobachtungszeitraum. Ich mag die richtigen numpy Rundfunk-Regeln anzuwenden, so dass ich tun kann:
log_lik = logp(M_vec,h_vec)
und es wird so lange wie die Abmessungen von M_vec
und h_vec
sind kompatibel zu arbeiten.
Meine aktuelle Implementierung verwendet numpy.vectorize
. Das funktioniert gut genug für 1 und 2, aber es ist zu langsam für 3. Beachten Sie auch, dass ich this nicht tun kann, weil die Anzahl der Fehler in meinen MultiData-Objekten nicht vorher bekannt ist.
Ist Ihr Grund zu fragen, weil Sie finden das Schreiben cython einfacher als C zu schreiben? Ich vermute, dass, wenn es möglich ist (was ich nicht weiß), Sie mit Code enden werden, der genauso komplex und unordentlich ist wie C, also kann es keinen Nutzen geben. – DaveP
@DaveP Es gibt zwei Gründe. Eine ist, dass ich es einfacher finde, in Cython als C zu schreiben. Die andere ist, dass ich diesen Prozess für Python-Programmierer leicht machen möchte, um sie für neue dtypes und ufuncs zu wiederholen. Ich hoffe, dass ich den größten Teil der Komplexität umhüllen kann und dtypes in Cython einfach machen kann. Das heißt, Cython ist etwas, über das ich erst letzte Woche erfahren habe. Ich habe damit gespielt, aber zu diesem Zeitpunkt verstehe ich seine Fähigkeiten nicht vollständig. – jcrudy
Es wäre nett, einen Anwendungsfall zu haben, damit wir Ihnen helfen können. – jlengrand