使用 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);
如果您的音频有多个声道,那么您必须分别转换每个声道。
我在我的 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);
如果您的音频有多个声道,那么您必须分别转换每个声道。