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个元素的数组时,大小为。
>>> import matlab
>>> A=matlab.int8([1,2,3,4,5])
>>> print(A.size)
(1, 5)
这里,初始化参数是一个包含5个数字的Python列表。MATLAB数组的大小为,用元组(1,5)表示。
- Python中的MATLAB数组属性和方法
matlab包构造函数创建的所有数组都有表所示的属性和方法,如表3-3所示。
表3-3 matlab包构造函数创建的数组的属性和方法
| 属性或方法 | 目 的 |
|---|---|
| size | 作为元组返回的数组的大小 |
reshape(size) |
按照指定的序列大小重塑数组 |
- Python中的多维MATLAB数组
在Python中,可以创建任何数值类型的多维MATLAB数组。下面使用两个单精度浮点型的Python列表创建一个的double型MATLAB数组。
>>> 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属性显示它是一个的数组。
>>> print(A.size)
(2, 5)
- 在Python中对MATLAB数组进行索引
可以在Python中索引MATLAB数组,就像索引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。
>>> print(A[0][2])
3
Python索引是基于0的,在Python中访问MATLAB数组的元素时,使用基于0的索引。
下面的例子演示如何索引多维MATLAB数组。
>>> A=matlab.double([[1,2,3,4,5], [6,7,8,9,10]])
>>> print(A[1][2])
8.0
- 在Python中对MATLAB数组进行切片
可以在Python中对MATLAB数组进行切片,就像对Python列表和元组进行切片一样。
>>> import matlab
>>> A=matlab.int8([1,2,3,4,5])
>>> print(A[0][1:4])
[2,3,4]
可以给切片赋数据。下面演示从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可迭代对象赋数据。
下面指定切片进行赋值。
>>> 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必须是一个序列,该序列不改变数组中的元素个数。下面用reshape方法将的MATLAB数组改成的。
>>> 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的方法,可以使用下面的代码调用该方法。
>>> 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型数组。