使用 Chaquopy 将 Python 中的 PyObject 转换为 Android 中的二维数组

Converting PyObject in Python to 2D array in Android using Chaquopy

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

编辑: 这是我的 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

Chaquopy 8.x 及更新版本:

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

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

Chaquopy 7.x 及以上:

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

我们假设 wavfile.read returns 是一维 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);

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