3

NumPy配列をJava配列に変換する方法の良い例がいくつかありますが、その逆ではありません-JavaオブジェクトからNumPy配列にデータを変換する方法。次のような Python スクリプトがあります。

    from py4j.java_gateway import JavaGateway
    gateway = JavaGateway()            # connect to the JVM
    my_java = gateway.jvm.JavaClass();  # my Java object
    ....
    int_array=my_java.doSomething(int_array); # do something

    my_numpy=np.zeros((size_y,size_x));
    for jj in range(size_y):
        for ii in range(size_x):
            my_numpy[jj,ii]=int_array[jj][ii];

my_numpyは Numpy 配列、int_arrayは整数の Java 配列 -int[ ][ ]一種の配列です。次のように Python スクリプトで初期化されます。

    int_class=gateway.jvm.int       # make int class
    double_class=gateway.jvm.double # make double class

    int_array = gateway.new_array(int_class,size_y,size_x)
    double_array = gateway.new_array(double_class,size_y,size_x)

そのままでも機能しますが、最速の方法ではなく、かなりゆっくりと動作します - ~1000x1000 配列の場合、変換には 5 分以上かかりました。

妥当な時間でこれを作成する方法はありますか?

私が試してみると:

    test=np.array(int_array)

私は得る:

    ValueError: invalid __array_struct__
4

2 に答える 2

2

同様の問題があり、py4j を介して Java 側から取得したスペクトル ベクトル (Java 配列) をプロットしようとしました。ここで、Java 配列から Python リストへの変換は、list() 関数によって実現されます。これは、NumPy配列を埋めるためにそれを使用する方法としていくつかの手がかりを与えるかもしれません...

vectors = space.getVectorsAsArray(); # Java array (MxN)
wvl = space.getAverageWavelengths(); # Java array (N)

wavelengths = list(wvl)

import matplotlib.pyplot as mp
mp.hold
for i, dataset in enumerate(vectors):
    mp.plot(wavelengths, list(dataset))

これが、使用したネストされた for ループよりも速いかどうかはわかりませんが、トリックも行います。

import numpy
from numpy  import array
x = array(wavelengths)
v = array(list(vectors))

mp.plot(x, numpy.rot90(v))
于 2016-09-27T13:50:19.040 に答える