数据类型转换

MATLAB中的数据类型与Python的是不一样的,将编译器生成的程序集集成到Python程序中时,需要首先考虑数据类型的转换问题。

Python传递数据给MATLAB

表3-1中列出了Python数据转换为MATLAB数据的数据转换规则。

表3-1 Python类型转换为MATLAB数组的转换规则

Python输入变量类型 MATLAB数据类型
matlab数值型数组对象 数值型数组
float double
complex Complex double
int int32(Windows), int64(Linux和Mac)
long int64
float('nan') NaN
float('inf') Inf
bool logical
str char
bytearray uint8 array
bytes uint8 array
字典 结构
列表 元胞数组
集合 元胞数组
元组 元胞数组
memoryview 不支持
range 元胞数组
None 不支持
module.type 不支持

2 MATLAB数组作为Python变量

  • 在Python中创建MATLAB数组

通过调用matlab Python包的构造函数(如matlab.double, matlab.int32),可以在Python中创建MATLAB数值型数组。构造函数的名称就是MATLAB数值型类型的名称。可以将MATLAB数组作为输入变量传递给从Python调用的MATLAB函数。MATLAB函数将数值型数组作为输出变量返回时,数组返回给Python。

可以用可选的包含数值的initializer输入变量初始化数组。initializer变量必须是Python序列类型的,诸如列表或元组。可选的size输入变量设置初始化数组的大小。创建多维数组,指定initializer包含多个数字序列,或指定size为多维的。设置可选的is_complex关键字变量为True,可以创建复数值的MATLAB数组。mlarray模块提供的MATLAB数组构造函数如表3-2所示。

表3-2 mlarray模块提供的MATLAB数组构造函数

matlab包中的类 Python中调用的构造函数 MATLAB数值类型
matlab.double matlab.double( initializer=None, size=None, is_complex=False) 双精度浮点型
matlab.single matlab.single( initializer=None, size=None, is_complex=False) 单精度浮点型
matlab.int8 matlab.int8( initializer=None, size=None, is_complex=False) 8位有符号整型
matlab.int16 matlab.int16( initializer=None, size=None, is_complex=False) 16位有符号整型
matlab.int32 matlab.int32( initializer=None, size=None, is_complex=False) 32位有符号整型
matlab.int64 matlab.int64( initializer=None, size=None, is_complex=False) 64位有符号整型
matlab.uint8 matlab.uint8( initializer=None, size=None, is_complex=False) 8位无符号整型
matlab.uint16 matlab.uint16( initializer=None, size=None, is_complex=False) 16位无符号整型
matlab.uint32 matlab.uint32( initializer=None, size=None, is_complex=False) 32位无符号整型
matlab.uint64 matlab.uint64( initializer=None, size=None, is_complex=False) 64位无符号整型
matlab.logical matlab.logical( initializer=None, size=None) 逻辑型
创建一个有N个元素的数组时,大小为。

创建一个有N个元素的数组时,大小为。

code.python
>>> import matlab
>>> A=matlab.int8([1,2,3,4,5])
>>> print(A.size)
(1, 5)
这里,初始化参数是一个包含5个数字的Python列表。MATLAB数组的大小为,用元组(1,5)表示

这里,初始化参数是一个包含5个数字的Python列表。MATLAB数组的大小为,用元组(1,5)表示。

  • Python中的MATLAB数组属性和方法

matlab包构造函数创建的所有数组都有表所示的属性和方法,如表3-3所示。

表3-3 matlab包构造函数创建的数组的属性和方法

属性或方法 目 的
size 作为元组返回的数组的大小
reshape(size) 按照指定的序列大小重塑数组
  • Python中的多维MATLAB数组
在Python中,可以创建任何数值类型的多维MATLAB数组。下面使用两个单精度浮点型的Python

在Python中,可以创建任何数值类型的多维MATLAB数组。下面使用两个单精度浮点型的Python列表创建一个的double型MATLAB数组。

code.python
>>> import matlab
>>> A=matlab.double([[1,2,3,4,5], [6,7,8,9,10]])
>>> print(A)
[[1.0,2.0,3.0,4.0,5.0],[1.0,7.0,8.0,9.0,10.0]]
A的size属性显示它是一个的数组。

A的size属性显示它是一个的数组。

code.python
>>> print(A.size)
(2, 5)
  • 在Python中对MATLAB数组进行索引

可以在Python中索引MATLAB数组,就像索引Python列表和元组一样。

code.python
>>> import matlab
>>> A=matlab.int8([1,2,3,4,5])
>>> print(A[0])
[1,2,3,4,5]

MATLAB数组的大小是(1,5),所以,A[0]为[1,2,3,4,5]。下面通过索引获取元素3。

code.python
>>> print(A[0][2])
3

Python索引是基于0的,在Python中访问MATLAB数组的元素时,使用基于0的索引。

下面的例子演示如何索引多维MATLAB数组。

code.python
>>> A=matlab.double([[1,2,3,4,5], [6,7,8,9,10]])
>>> print(A[1][2])
8.0
  • 在Python中对MATLAB数组进行切片

可以在Python中对MATLAB数组进行切片,就像对Python列表和元组进行切片一样。

code.python
>>> import matlab
>>> A=matlab.int8([1,2,3,4,5])
>>> print(A[0][1:4])
[2,3,4]

可以给切片赋数据。下面演示从Python列表向数组赋值。

code.python
>>> A=matlab.double([[1,2,3,4],[5,6,7,8]])
>>> A[0]=[10,20,30,40]
>>> print(A)
[[10.0,20.0,30.0,40.0],[5.0,1.0,7.0,8.0]]

可以从另一个MATLAB数组赋数据,或从任何包含数字的Python可迭代对象赋数据。

下面指定切片进行赋值。

code.python
>>> A=matlab.int8([1,2,3,4,5,6,7,8])
>>> A[0][2:4]=[30,40]
>>> A[0][6:8]=[70,80]
>>> print(A)
[[1,2,30,40,5,6,70,80]]
  • 在Python中对MATLAB数组进行重塑
可以在Python中用reshape方法对MATLAB数组进行重塑。输入变量size必须是一个序列, 可以在Python中用reshape方法对MATLAB数组进行重塑。输入变量size必须是一个序列,

可以在Python中用reshape方法对MATLAB数组进行重塑。输入变量size必须是一个序列,该序列不改变数组中的元素个数。下面用reshape方法将的MATLAB数组改成的。

code.python
>>> import matlab
>>> A=matlab.int8([1,2,3,4,5,6,7,8,9])
>>> A.reshape((3,3))
>>> print(A)
[[1,4,7],[2,5,8],[3,6,9]]

3 管理从MATLAB返回给Python的数据

MATLAB函数返回输出变量时,MATLAB将数据转换为等价的Python数据类型,如表3-4所示。

表3-4 MATLAB数据类型与Python数据类型的等价关系

MATLAB输出变量的类型 Python等价数据类型
数值型数组 matlab数值型数组对象
double, single float
Complex(任意数值型类型) complex
int8, uint8, int16, uint16, int32 int
uint32, int64, uint64 int, long
NaN float('nan')
Inf float('inf')
logical bool
char型数组(,) char型数组() str 不支持
结构 字典
行或列元胞数组 列表
的元胞数组 不支持
MATLAB句柄对象(table, containers.Map, 分类数组) 不支持
其它对象(如Java) 不支持
函数句柄 不支持
稀疏数组 不支持
字符串数组 不支持
结构数组 不支持

4 在Python中使用MATLAB数组

在Python中创建MATLAB数组,并调用MATLAB函数。假设有一个名为mypackage的包,包中有一个名为mysqrt的方法,可以使用下面的代码调用该方法。

code.python
>>> import matlab
>>> import mypackage
>>> pkg=mypackage.initialize()
>>> x=matlab.double([1,4,9,16,25])
>>> print(pkg.mysqrt(x))
[[1.0,2.0,3.0,4.0,5.0]]

可以用matlab.double创建一个double型数组,其中给出了包含数字的Python列表。可以对x调用MATLAB函数,例如mysqrt,返回值是另一个matlab.double型数组。