2016-04-06 19 views
2

私は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[][]の行列を不変の配列として扱います。すなわち、それを決して変更しようとはしない。

答えて

3

私は、この特定のケースの解決策を見つけました。

Python bytearrayオブジェクトを効率的にJavaに転送し、byte[]という配列としてPy4jをサポートしています。私はオリジナルのライブラリとPythonコードを変更することで問題を解決しました。

新しいJavaコード:

public class MyClass { 
    // ... 
    public static MyObject create(int[][] matrix) { 
     // ... 
    } 
    public static MyObject createFromPy4j(byte[] data) { 
     java.nio.ByteBuffer buf = java.nio.ByteBuffer.wrap(data); 
     int n = buf.getInt(), m = buf.getInt(); 
     int[][] matrix = new int[n][m]; 
     for (int i = 0; i < n; ++i) 
     for (int j = 0; j < m; ++j) 
      matrix[i][j] = buf.getInt(); 
     return MyClass.create(matrix); 
    } 
} 

新しいPythonコード:

def create_java_object(numpy_matrix): 
    header = array.array('i', list(numpy_matrix.shape)) 
    body = array.array('i', numpy_matrix.flatten().tolist()); 
    if sys.byteorder != 'big': 
     header.byteswap() 
     body.byteswap() 
    buf = bytearray(header.tostring() + body.tostring()) 
    return java_instance.jvm.my.namespace.MyClass.createFromPy4j(buf) 

これは数秒ではなく数分で実行されます。

+0

これは2Dマトリックスでのみ機能しますか?どのような形状の行列を送ることができるように、最初の値として形状の長さを保存するのはどうですか? – crockpotveggies

関連する問題