MATLAB 数组作为 Python 变量
matlab
Python® 模块提供数组类以将 MATLAB® 数值类型的数组表示为 Python 变量,以便 MATLAB 数组可以在 Python 和 MATLAB 之间传递。
matlab.engine
Python 模块中的 MATLAB 类
通过导入 matlab.engine
Python 包并调用必要的构造函数,您可以在 Python 代码中使用 MATLAB 数值数组。例如:
import matlab.engine a = matlab.double([[1, 2, 3],[4, 5, 6]])
您可以自定义数组构造函数,如下所示:
您可以使用包含数字的可选
initializer
输入参量初始化数组。作为第一个位置参量的initializer
参量必须为 Python 序列类型,例如list
、tuple
或range
。您可以指定initializer
包含多个数字序列。您可以使用可选的
vector
输入参量(该参量包含大小为 1×N 的输入)初始化数组。如果使用vector
,则无法使用initializer
。注意
当输入大小为 1×N 时,使用
vector
比使用initializer
更高效。Python 始终知道一维序列的长度,它可以使用此信息来执行将保留输出的数组的单次分配。您可以使用以下选项之一创建一个多维数组:
指定一个嵌套序列,但不指定大小。
指定一个嵌套序列,并指定与该嵌套序列的维度匹配的
size
输入参量。指定一个一维序列和一个多维大小。在本例中,假设序列以列优先顺序表示元素。
通过将可选的
is_complex
输入参量设置为True
,可以创建复数 MATLAB 数组。您可以使用自定义类型在 Python 中创建 MATLAB 数组。自定义类型必须实现 Python 缓冲区协议。NumPy 中的
ndarray
就是一个示例。
您可以使用以下类创建 MATLAB 数组:
| Python 中的构造函数调用 | 示例 |
---|---|---|
| matlab.double(initializer=None|vector=None, size=None, is_complex=False) | >>> a = matlab.double(4) >>> b = matlab.double(vector=[11, 22, 33]) >>> c = matlab.double([[10, 20],[30,40]]) >>> d = matlab.double(initializer=[[10, 20],[30,40]], size=[2,2],is_complex=False) >>> e = matlab.double(vector=range(0, 20)) >>> f = matlab.double(vector=[x*x for x in range(0, 10, 2)]) >>> g = matlab.double([[1.1+2.4j, 3+4j],[5.3,6.7]], is_complex=True) |
| matlab.single(initializer=None|vector=None, size=None, is_complex=False) | >>> a = matlab.single([[1.1, 2.2, 3.3],[4.4, 5.5, 6.6]]) >>> a = matlab.single(vector=[11, 22, 33], is_complex=False) |
| matlab.int8(initializer=None|vector=None, size=None, is_complex=False) | >>> a = matlab.int8([[11, 22, 33],[44, 55, 66]]) >>> a = matlab.int8(vector=[11, 22, 33], is_complex=False) |
| matlab.int16(initializer=None|vector=None, size=None, is_complex=False) | >>> e = matlab.int16([[1+2j, 3+4j],[-5,6]], is_complex=True) |
| matlab.int32(initializer=None|vector=None, size=None, is_complex=False) | >>> a = matlab.int32(initializer=[[11, 22, 33],[44, -55, 66]], size=[2,3], is_complex=False) |
| matlab.int64(initializer=None|vector=None, size=None, is_complex=False) | >>> a = matlab.int64([[11, 22, 33],[44, -55, 66]]) |
| matlab.uint8(initializer=None|vector=None, size=None, is_complex=False) | >>> a = matlab.uint8([[11, 22, 33],[44, 55, 66]]) >>> b = matlab.uint8(vector=[11, 22, 33], is_complex=False) |
| matlab.uint16(initializer=None|vector=None, size=None, is_complex=False) | >>> a = matlab.uint16(initializer=[[11, 22, 33],[44, 55, 66]], size=[2,3], is_complex=False) >>> b = matlab.uint16(vector=[11, 22, 33], is_complex=False) >>> c = matlab.uint16([[11, 22, 33],[44, 55, 66]]) |
| matlab.uint32(initializer=None|vector=None, size=None, is_complex=False) | >>> a = matlab.uint32(vector=[11, 22, 33], is_complex=False) >>> b = matlab.uint32([[11, 22, 33],[44, 55, 66]]) |
| matlab.uint64(initializer=None|vector=None, size=None, is_complex=False) | >>> a = matlab.uint64([[11, 22, 33],[44, 55, 66]]) >>> b = matlab.uint64(vector=[11, 22, 33], is_complex=False) |
| matlab.logical(initializer=None|vector=None, size=None)a | >>> a = matlab.logical(initializer=[[True, False, True],[True, True, True]], size=[2,3]) >>> b = matlab.logical([[True, False, True],[True, True, True]]) >>> c = matlab.logical(vector=[True, False, True]) >>> d = matlab.logical([True, False, True]) |
a Logicals cannot be made into an array of complex numbers. |
matlab
Python 包中 MATLAB 类的属性和方法
使用 matlab.engine
包构造函数创建的所有 MATLAB 数组都具有以下属性和方法:
属性
属性名称 | 描述 | 示例 |
---|---|---|
| 表示数组维数的整数组成的元组 | >>> a = matlab.int16([[1, 2, 3],[4, 5, 6]]) >>> a.size (2, 3) |
| 表示数组元素的字节大小的整数 | >>> a = matlab.int16() >>> a.itemsize 2 >>> b = matlab.int32() >>> b.itemsize 4 |
方法
方法名称 | 用途 | 示例 |
---|---|---|
clone() | 返回一个新的不同对象,其内容与原始对象的内容相同 | >>> a = matlab.int16( [[1, 2, 3],[4, 5, 6]]) >>> b = a.clone() >>> print(b) [[1,2,3],[4,5,6]] >>> b[0][0] = 100 >>> b matlab.int16( [[100,2,3],[4,5,6]]) >>> print(a ) [[1,2,3],[4,5,6]] |
real() | 以 1×N 数组形式按列优先顺序返回复数元素的实部 | >>> a = matlab.int16([[1 + 10j, 2 + 20j, 3 + 30j],[4, 5, 6]], is_complex=True) >>> print(a.real()) [1,4,2,5,3,6] |
imag() | 以 1×N 数组形式按列优先顺序返回复数元素的虚部 | >>> a = matlab.int16([[1 + 10j, 2 + 20j, 3 + 30j],[4, 5, 6]], is_complex=True) >>> print(a.imag()) [10,0,20,0,30,0] |
noncomplex() | 以 1×N 数组形式按列优先顺序返回非复数元素 | >>> a = matlab.int16( [[1, 2, 3],[4, 5, 6]]) >>> print(a.noncomplex()) [1,4,2,5,3,6] |
| 根据维数重构数组并返回结果 | >>> a = matlab.int16( [[1, 2, 3],[4, 5, 6]]) >>> print(a) [[1,2,3],[4,5,6]] >>> a.reshape(3, 2) >>> print(a) [[1,5],[4,3],[2,6]] |
toarray() | 返回基于内容构造的标准 Python | >>> a = matlab.int16( [[1, 2, 3],[4, 5, 6]]) >>> a[0].toarray() array('h', [1, 2, 3]) >>> b = matlab.int16( [[1 + 10j, 2 + 20j, 3 + 30j],[4, 5, 6]], is_complex=True) >>> b.real().toarray() array('h', [1, 4, 2, 5, 3, 6]) |
tomemoryview() | 返回基于内容构造的标准 Python | >>> a = matlab.int16( [[1, 2, 3],[4, 5, 6]]) >>> b = a.tomemoryview() >>> b.tolist() [[1, 2, 3], [4, 5, 6]] >>> b.shape (2, 3) |
Python 中的多维 MATLAB 数组
在 Python 中,您可以创建任何数值类型的多维 MATLAB 数组。使用两个 Python list
变量创建一个 2×5 MATLAB 双精度数组。
import matlab.engine 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],[6.0,7.0,8.0,9.0,10.0]]
A
的 size
属性显示它是 2×5 数组。
print(A.size)
(2, 5)
在 Python 中对 MATLAB 数组进行索引
就像您可以对 Python list
和 tuple
变量进行索引一样,您也可以对 MATLAB 数组进行索引。
import matlab.engine 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 list
和 tuple
变量进行切片一样,对 MATLAB 数组进行切片。
import matlab.engine A = matlab.int8([[1,2,3,4,5]]) print(A[0][1:4])
[2,3,4]
您可以将数据分配到一个切片。以下代码显示从 Python list
到一个数组切片的分配。
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,6.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 数组
您可以使用 reshape
方法在 Python 中重构 MATLAB 数组。输入参量 size
必须是保留元素数量的一个序列。使用 reshape
将 1×9 MATLAB 数组更改为 3×3。
import matlab.engine 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]]