2

Chaquopy在我的android项目中使用。我的 python 类中有一个函数,它返回一个二维数组作为PyObject类型。现在,我想在我的 java 类中将它转换为二维数组。我怎样才能做到这一点?

编辑:这是我的 Python 代码:

import numpy as np
from scipy.io import wavfile

def get_python_audio(file_path):
 fs, data_test = wavfile.read(file_path)
 print('data_test:', data_test.shape)
 data = data_test[:, 0]
 data = data[:, np.newaxis]
 print('data:', data.shape)


 return data
4

1 回答 1

4

Chaquopy 8.x 和更新版本:

现在可以直接转换相同类型的 NumPy 数组和 Java 数组。假设get_python_audio返回一个一维 int16 数组:

short[] data = yourModule.callAttr("get_python_audio", filePath).toJava(short[].class);

Chaquopy 7.x 及更早版本:

在 Java 和 Python 之间转换数值数组的最快方法是使用字节数组。

我们假设它wavfile.read返回一个一维 int16 数组,但这种技术很容易适应其他数据类型。然后在 Python 中,你可以这样做:

def get_python_audio(file_path):
   fs, data_test = wavfile.read(file_path)
   return data_test.tobytes()

在 Java 中:

byte[] bytesData = yourModule.callAttr("get_python_audio", filePath).toJava(byte[].class);
short[] shortData = new short[bytesData.length / 2];
ByteBuffer.wrap(bytesData).order(ByteOrder.nativeOrder()).asShortBuffer().get(shortData);

如果您的音频有多个通道,那么您必须分别转换每个通道。

于 2019-10-27T10:33:39.810 回答