回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我想在Python中调用Matlab.m文件和函数,但是由于Matlab和Python之间的数据类型不同,出现了一个关于<code>TypeError: unsupported Python data type: numpy.ndarray</code>的错误。在</p>
<p>作为下面代码中的一个示例,<code>VoxelSizeUnification</code>是一个Matlab函数,我想在Python中调用它,它的输入来自Python数据类型:</p>
<pre><code>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
</code></pre>
<p>即:</p>
^{pr2}$
<p>另外,我使用<a href="https://stackoverflow.com/questions/10997254/converting-numpy-arrays-to-matlab-and-vice-versa">link1</a>搜索,但我不想保存文件然后再加载它们。同样在<a href="https://github.com/ewiger/mlab" rel="nofollow noreferrer">link2</a>中,mlab应该使用python>;=2.7,我的python是3.6.6和matlab2017b</p>
<p>另外,我尝试了<code>matlab.double</code>,并用一个示例测试了上面的代码,<strong>没有任何错误</strong>:</p>
<pre><code>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)
</code></pre>
<p>但是对于<code>volume_image</code>这是一个3D图像数组,我收到一个关于<code>ValueError: initializer must be a rectangular nested sequence</code>的错误。在</p>
<p>Python:</p>
<pre><code>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)
</code></pre>
<p>Matlab软件:</p>
<pre><code>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
</code></pre>
<p><code>ValueError: initializer must be a rectangular nested sequence</code>的原因是什么?谢谢。在</p>