#android-studio #chaquopy
#android-studio #chaquopy
Вопрос:
Скрипт pythor возвращает 2d-массив numpy ‘float64’. Когда я пытаюсь присвоить ему «двойной» массив в java, я получаю эту ошибку «java.lang.ClassCastException: ошибка типа: не удается преобразовать объект float64 в double[] «
Редактировать
import librosa as lb
import numpy as np
from os.path import dirname, join
def build_feat(fpath):
filename = join(dirname(__file__), fpath)
wav, rate = lb.load(filename, sr=4000)
X_sample = lb.feature.mfcc(wav, sr=rate, n_fft=512, win_length=400, n_mfcc=20,
hop_length = 256, n_mels = 128, fmin = 100, fmax = 1800)
X = X_sample.T
return X
Код Java:
PyObject pyobj = py.getModule("featureExtraction");
PyObject obj = pyobj.callAttr("build_feat","107_2b4_Pl_mc_AKGC417L_0.wav");
double[][] feat = obj.toJava(double[][].class);
для того же кода я получаю другую ошибку сейчас: com.chaquo.python.PyException: ValueError: ndarray is not contiguous
Комментарии:
1. Похоже, вы пытаетесь преобразовать 1D массив Numpy в 2D массив Java. Пожалуйста, отредактируйте свой вопрос, чтобы включить соответствующие разделы вашего кода на Python и Java.
2. Кроме того, какую версию Chaquopy вы используете?
3. Я использую Chaquopy версии 8.0.1.
4.
import librosa as lb import numpy as np from os.path import dirname, join def build_feat(fpath): filename = join(dirname(__file__), fpath) wav, rate = lb.load(filename, sr=4000) X_sample = lb.feature.mfcc(wav, sr=rate, n_fft=512, win_length=400, n_mfcc=20, hop_length = 256, n_mels = 128, fmin = 100, fmax = 1800) X = X_sample.T return X
5. Код Java:
if(!Python.isStarted()) Python.start(new AndroidPlatform(this)); Python py = Python.getInstance(); PyObject pyobj = py.getModule("featureExtraction"); PyObject obj = pyobj.callAttr("build_feat","107_2b4_Pl_mc_AKGC417L_0.wav"); double[][] feat = obj.toJava(double[][].class);
Ответ №1:
Проблема вызвана тем, что массив транспонируется и, следовательно, не является непрерывным.
Эта проблема исправлена в Chaquopy 9.0.0. В более старых версиях вы можете обойти ее, либо вернув исходный массив ( X_sample
), либо создав копию после транспонирования ( X_sample.T.copy()
).
Комментарии:
1. Это сработало. Спасибо. Я изо всех сил старался отформатировать код в разделе комментариев, не думал о редактировании вопроса. Извините за это