Как решить "TypeError" и "ValueError" после вызова файлов Matlab .m в Python3.x? - PullRequest
0 голосов
/ 30 октября 2018

Я хочу вызывать Matlab .m-файлы и функции в Python, но из-за разного типа данных между Matlab и Python возникает ошибка около TypeError: unsupported Python data type: numpy.ndarray.

В качестве примера в приведенном ниже коде VoxelSizeUnification - это функция Matlab, которую я хочу вызвать в Python, и ее входные данные относятся к типам данных Python:

import matlab.engine
eng = matlab.engine.start_matlab()

xyzSpacing = [dcm_image.SliceThickness, dcm_image.PixelSpacing[1], dcm_image.PixelSpacing[0]]
xyzNewSpacing = [1.25, 1.25, 1.25]
eng.VoxelSizeUnification(volume_image, xyzNewSpacing, xyzSpacing)  # TypeError: unsupported Python data type: numpy.ndarray

, что:

volume_image is {ndarray} and includes images as: volume_image[number of slices in 3rd dimenson = 133, rows=512, columns=512].
xyzNewSpacing and xyzSpacing are <class 'list'> with size of (1 x 3)

Также я искал, используя link1 , но я не хочу сохранять файлы и затем загружать их. Также в link2 mlab должен работать с python> = 2.7, а мой Python - 3.6.6 и Matlab 2017b.

Кроме того, я попытался matlab.double и протестировал приведенный выше код на примере без ошибок :

xyzNewSpacing = matlab.double([1.25, 1.25, 1.25])
xyzSpacing = matlab.double([1.5, 1.5, 1.5])
vol = matlab.double([[[1, 2, 1], [3, 1, 5], [2, 1, 2]],
                     [[2, 3, 1], [1, 2, 3], [2, 1, 3]],
                     [[4, 2, 1], [2, 3, 1], [3, 2, 1]]])
ret = eng.VoxelSizeUnification(vol, xyzNewSpacing, xyzSpacing)

Но для volume_image, который является трехмерным массивом изображений, я получаю сообщение об ошибке: ValueError: initializer must be a rectangular nested sequence.

Python:

xyzNewSpacing = matlab.double([1.25, 1.25, 1.25])
xyzSpacing = matlab.double([1.5, 1.5, 1.5])
d = matlab.double(volume_image) # ValueError: initializer must be a rectangular nested sequence
ret = eng.VoxelSizeUnification(d, xyzSpacing, xyzNewSpacing)

Matlab:

function outputSize = VoxelSizeUnification(d, xyzSpacing, xyzNewSpacing)
         outputSize = [ceil((d(1)*xyzSpacing(1))/xyzNewSpacing(1))...
                      ceil((d(2)*xyzSpacing(2))/xyzNewSpacing(2))...
                       ceil((d(3)*xyzSpacing(3))/xyzNewSpacing(3))];
end

В чем причина ValueError: initializer must be a rectangular nested sequence? Спасибо.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Ошибка произошла из-за datatypes и при использовании volume_image = volume_image.tolist() ошибка была устранена. Тем не менее, это заняло много времени. Так что, если у всех есть хорошая идея, пожалуйста, поделитесь ею.

0 голосов
/ 30 октября 2018

Вы пробовали использовать mlabwrap?

Проверьте эту ссылку - возможно, вам поможет

Вызов MATLAB .m-файлов и функций в скрипте Python

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...