2016-08-23 60 views
1

如何将NumPy数组转换为Java数组,但不是反之亦然 - 如何将数据从Java对象转换回NumPy数组。我有一个Python脚本是这样的:将Java数组快速转换为NumPy数组(Py4J)

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) 

虽然,它的工作原理,因为它是,它是不是最快的方式相当缓慢的工作 - 为1000×1000〜阵列,转换耗时超过5分钟。

有什么办法如何使这与合理的时间?

如果我尝试:

test=np.array(int_array) 

我得到:

ValueError: invalid __array_struct__ 

回答

0

我也有过类似的问题,只是想绘制频谱向量(Java数组)我通过从Java端了py4j。 这里,通过list()函数实现从Java Array到Python列表的转换。这可能会提供一些线索如何使用它来填充与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)) 

这是否是比嵌套快为你所用,我不能说循环,而且还做的伎俩:

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

mp.plot(x, numpy.rot90(v))