ошибка типа при преобразовании Pyobject в массив java

#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. Это сработало. Спасибо. Я изо всех сил старался отформатировать код в разделе комментариев, не думал о редактировании вопроса. Извините за это