在 Python3.x 中调用 Matlab .m 文件后如何解决

我想在 Python 中调用 Matlab .m 文件和函数,但是由于 Matlab 和 Python 之间的数据类型不同,出现了关于 .m 文件的错误TypeError: unsupported Python data type: numpy.ndarray。


作为以下代码中的示例VoxelSizeUnification,我想在 Python 中调用它的 Matlab 函数,其输入来自 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这是图像的3D阵列,收到错误约: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什么?谢谢。


森林海
浏览 407回答 2
2回答

30秒到达战场

错误是因为datatypes使用volume_image = volume_image.tolist()错误已解决。然而,它花费了大量的运行时间。所以,如果每个人都有好主意,请分享它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python