私はpy4jを使い、ユーザーフレンドリーなPythonライブラリを作成しました。ほとんどの場合、これは簡単で、py4jは素晴らしいツールでした。しかし、私はPythonとJavaの間で行列を送るときに悩まされました。py4jを使ってPythonからJavaにint [] []の配列として行列を送信する
具体的には、私は、その引数として、整数行列を受け入れ、Javaで静的な機能を持っている:
public class MyClass {
// ...
public static MyObject create(int[][] matrix) {
// ...
}
}
私はそうのようPy4jからこれを呼び出すことができるようにしたい:
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)
これはうまくいきません。numpy_matrix
が代わりにプレーンなpythonリストのリストに変換されていてもうまくいきません。私はその解決策がJava配列を構築し、関数呼び出しの前にデータを転送することを期待していました:今度は、このコードが正しく実行されます。ただし、実行するには約2分が必要です。私が扱っている行列は、(3 x〜300,000)要素のオーダーです。
行列を変換するだけの時間がかからないPy4jで標準的な方法がありますか?私はそれを2〜2回服用しても構いませんが、これはあまりにも遅いです。 Py4jがこのような通信のために設定されていない場合、Python用のJava interopライブラリはありますか?
注:Javaライブラリはint[][]
の行列を不変の配列として扱います。すなわち、それを決して変更しようとはしない。
これは2Dマトリックスでのみ機能しますか?どのような形状の行列を送ることができるように、最初の値として形状の長さを保存するのはどうですか? – crockpotveggies