So rufen Sie eine java-Funktion aus python/numpy?
es ist mir klar, wie erweitern Python mit C++, aber was ist, wenn ich möchte eine Funktion schreiben, die in Java verwendet werden, mit numpy?
Hier ist ein einfaches Szenario: ich möchte berechnen Sie den Durchschnitt von ein numpy-array mit Hilfe einer Java-Klasse. Wie gebe ich die numpy-Vektor der Java-Klasse und sammeln das Ergebnis?
Vielen Dank für jede Hilfe!!!
Haben Sie einen Blick auf ist-es-eine-gute-numpy-Klon-für-jython
gut, ich bin nicht wirklich auf der Suche für einen Klon, da habe ich schon einige numpy-code und ich finde numpy sehr gut. Es ist eine schade, es gibt keinen direkten Weg, um numpy mit Java...
Ist der Java-code-Basis signifikant genug, in der Größe, die es unmöglich machen würde, die Sie von nur re-writing der Leistung sensible Bereiche, in Cython und verwenden numpy/python für den rest?
es ist mehr eine strategische Entscheidung, die ich nicht haben eine Menge von Java-code jetzt. Viele Leute benutzen C++ für wissenschaftliches rechnen, aber ich habe das Gefühl, dass Java ersetzen könnte C++ für diese in die Zukunft. Also idealerweise python/numpy sollte in der Lage sein zu verwenden, C++ - und Java-Klassen (wie matlab). Wenn die garbage collection ist wirklich ein problem, würde man verlängern python mit C++ ansonsten Java wäre besser
Ich habe nicht gesehen ein trend zur Verbreitung von Java in der wissenschaftlichen Gemeinschaft und angesichts der Tatsache, dass es klingt wie Sie nicht haben eine Menge von code zu konvertieren, ist es wahrscheinlich am besten für den Einsatz von etablierten tools wie Cython, beschreiten, anstatt in unbekanntes und nicht unterstützte Gewässern mit Java. Die strategische Entscheidung ist eher die pragmatische, eine für die Verwendung der Technologien, die heute verfügbar sind.
gut, ich bin nicht wirklich auf der Suche für einen Klon, da habe ich schon einige numpy-code und ich finde numpy sehr gut. Es ist eine schade, es gibt keinen direkten Weg, um numpy mit Java...
Ist der Java-code-Basis signifikant genug, in der Größe, die es unmöglich machen würde, die Sie von nur re-writing der Leistung sensible Bereiche, in Cython und verwenden numpy/python für den rest?
es ist mehr eine strategische Entscheidung, die ich nicht haben eine Menge von Java-code jetzt. Viele Leute benutzen C++ für wissenschaftliches rechnen, aber ich habe das Gefühl, dass Java ersetzen könnte C++ für diese in die Zukunft. Also idealerweise python/numpy sollte in der Lage sein zu verwenden, C++ - und Java-Klassen (wie matlab). Wenn die garbage collection ist wirklich ein problem, würde man verlängern python mit C++ ansonsten Java wäre besser
Ich habe nicht gesehen ein trend zur Verbreitung von Java in der wissenschaftlichen Gemeinschaft und angesichts der Tatsache, dass es klingt wie Sie nicht haben eine Menge von code zu konvertieren, ist es wahrscheinlich am besten für den Einsatz von etablierten tools wie Cython, beschreiten, anstatt in unbekanntes und nicht unterstützte Gewässern mit Java. Die strategische Entscheidung ist eher die pragmatische, eine für die Verwendung der Technologien, die heute verfügbar sind.
InformationsquelleAutor Mannaggia | 2012-05-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verbrachte ich einige Zeit auf meine eigene Frage und würde gerne meine Antwort, wie ich finde, es gibt nicht viel Informationen zu diesem Thema auf stackoverflow. Ich denke auch Java wird relevanter werden im wissenschaftlichen rechnen (z.B. siehe WEKA-Paket für data mining) wegen der Verbesserung der Leistung und andere gute software-development-Funktionen von Java.
Im Allgemeinen, es stellt sich heraus, dass mit den richtigen tools ist es viel einfacher zu erweitern ist Python mit Java als mit C/C++!
Übersicht und Bewertung von tools zum Aufruf von Java aus Python
http://pypi.python.org/pypi/JCC: von wegen kein richtiges
Dokumentation dieses tool ist nutzlos.
Py4J: erfordert zum starten der Java-Prozess, der vor der Verwendung von python. Als
bemerkte, von anderen ist dies eine mögliche Fehlerquelle. Darüber hinaus gibt es nicht viele Beispiele für Ihre Verwendung sind zu dokumentieren.
JPype: obwohl die Entwicklung scheint den Tod, es funktioniert gut und es gibt
viele Beispiele auf der web - (z.B. siehe http://kogs-www.informatik.uni-hamburg.de/~meine/weka-python/ für die Verwendung von data-mining-Bibliotheken, die in Java geschrieben) . Daher entschied ich mich
auf dieses tool.
Installieren JPype auf Fedora 16
Bin ich mit Fedora 16, da es einige Probleme bei der Installation JPype auf Linux, beschreibe ich meine Vorgehensweise.
Download JPype, dann ändern setup.py Skript, indem Sie die JDK-Pfad, in Zeile 48:
führen:
Afters, war die installation erfolgreich, diese Datei:
/usr/lib64/python2.7/site-packages/jpype/_linux.py
und entfernen Sie oder benennen Sie die Methode getDefaultJVMPath() in getDefaultJVMPath_old(), dann fügen Sie die folgende Methode:
Alternativer Ansatz: machen Sie nicht jede änderung der oben angegebenen Datei _linux.py, aber nie verwenden Sie die Methode getDefaultJVMPath() (oder Methoden, die diese Methode aufrufen). An der Stelle der Verwendung getDefaultJVMPath() direkt den Pfad zur JVM. Beachten Sie, dass es gibt mehrere Wege, zum Beispiel in meinem system, ich habe auch die folgenden Pfade, auf verschiedene Versionen der JVM (es ist mir nicht klar, ob die client-oder server-JVM ist besser geeignet):
Schließlich, fügen Sie die folgende Zeile ~/.bashrc (oder starten Sie es jedes mal vor dem öffnen einer python-interpreter):
(Das obige Verzeichnis ist in Wirklichkeit nur ein symbolischer link zu meiner letzten version des JDK, die sich in /usr/java/jdk1.7.0_04).
Beachten Sie, dass alle tests in das Verzeichnis, in dem JPype heruntergeladen wurde, d.h. JPype-0.5.4.2/test/testsuite.py wird scheitern (so egal).
Um zu sehen, ob es funktioniert, testen Sie dieses Skript in python:
Aufruf von Java-Klassen aus Java auch mit Numpy
Beginnen wir die Implementierung einer Java-Klasse, enthält einige Funktionen, die ich anwenden möchten, um numpy-arrays. Da gibt es kein Konzept von Staat, verwende ich statische Funktionen, so dass ich brauche nicht zu jedem Java-Objekt (erstellen von Java-Objekten würde nichts ändern).
Den Namen der Klasse ist ein wenig irreführend, als wir nicht nur das Ziel in der Berechnung des Durchschnitts der numpy-Vektor (mit der Methode compute_average), sondern auch multiplizieren ein numpy-Vektor durch einen Skalar (Methode multiplizieren), und schließlich die matrix-Multiplikation (Methode mult_mat).
Nach dem kompilieren der oben genannten Java-Klasse können wir jetzt führen Sie das folgende Python-Skript:
InformationsquelleAutor Mannaggia
Halte ich Jython eine der besten Möglichkeiten - das macht es nahtlos zu verwenden java-Objekte in python. Ich eigentlich integriert weka mit meinem python-Programme, und es war super einfach. Importieren Sie einfach die weka-Klassen und rufen Sie, als würden Sie in java-in python-code.
http://www.jython.org/
InformationsquelleAutor user1669710
Ich bin mir nicht sicher über den numpy-support, aber kann Folgendes hilfreich sein:
http://pypi.python.org/pypi/JCC/
neben der Dokumentation der GBA ist schrecklich (oder sollte ich sagen fehlt?), Ich habe keine Ahnung, wie es zu benutzen...
InformationsquelleAutor JoshAdel