Ich habe py4j verwendet, um eine benutzerfreundliche Python-Bibliothek um eine weniger benutzerfreundliche Java-Bibliothek zu bauen. In den meisten Fällen war dies ein Kinderspiel, und py4j war ein großartiges Werkzeug. Ich habe jedoch einen Haken beim Senden von Matrizen zwischen Python und Java gefunden.Verwenden von py4j zum Senden von Matrizen von Python zu Java als int [] [] arrays
Insbesondere habe ich eine statische Funktion in Java, die als ihre Argumente, eine ganzzahlige Matrix übernimmt:
public class MyClass {
// ...
public static MyObject create(int[][] matrix) {
// ...
}
}
I dies möchte in der Lage sein Anruf von Py4j etwa so:
def create_java_object(numpy_matrix):
# <code here checks that numpy_matrix is a (3 x n) integer matrix>
# ...
return java_instance.jvm.my.namespace.MyClass.create(numpy_matrix)
Dies funktioniert nicht, was nicht zu überraschend ist, noch funktioniert es, wenn die numpy_matrix
stattdessen in eine Liste von einfachen Python-Listen konvertiert wird. Ich hatte erwartet, dass die Lösung wäre, einen Java-Array zu erstellen und die Daten über vor dem Funktionsaufruf übertragen:
def create_java_object(numpy_matrix):
# <code here checks that numpy_matrix is a (3 x n) integer matrix>
# ...
java_matrix = java_instance.new_array(java_instance.jvm.int, 3, n)
for i in range(numpy_matrix.shape[1]):
java_matrix[0][i] = int(numpy_matrix[0, i])
java_matrix[1][i] = int(numpy_matrix[1, i])
java_matrix[2][i] = int(numpy_matrix[2, i])
return java_instance.jvm.my.namespace.MyClass.create(java_matrix)
Nun dieser Code ordnungsgemäß ausgeführt wird. Es erfordert jedoch etwa zwei Minuten zu laufen. Die Matrizen, mit denen ich arbeite, liegen übrigens in der Größenordnung von (3 x ~ 300.000) Elementen.
Gibt es eine kanonische Methode, dies in Py4j zu tun, die keine unglaubliche Zeit benötigt, nur um eine Matrix zu konvertieren? Es macht mir nichts aus, dass es ein oder zwei Sekunden dauert, aber das ist viel zu langsam. Wenn Py4j nicht für diese Art der Kommunikation eingerichtet ist, gibt es eine Java-Interop-Bibliothek für Python?
Hinweis: Die Java-Bibliothek behandelt die int[][]
-Matrix als ein unveränderliches Array; d. h. es versucht niemals, es zu modifizieren.
Dies würde nur für 2D-Matrizen funktionieren? Wie wäre es, die Formlänge als ersten Wert zu speichern, damit Sie eine Matrix beliebiger Form senden können? – crockpotveggies