主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

matlab Python 模块

matlab Python® 模块提供类来将 MATLAB® 数值类型的数组表示为 Python 变量。您可以使用这些类在 MATLAB 和 Python 之间传递 MATLAB 数组。

matlab Python 模块中的 MATLAB

您可以通过导入 matlab MATLAB 包并调用必要的构造函数在 Python 代码中使用 Python 数字数组。例如:

import matlab
a = matlab.double([[1, 2, 3],[4, 5, 6]]) 
构造函数的名称表明 MATLAB 数值类型。您可以将 MATLAB 数组作为输入参量传递给从 MATLAB 调用的 Python 函数。当 MATLAB 函数返回数字数组作为输出参量时,该数组将返回给 Python。

您可以自定义数组构造函数,如下所示:

  • 您可以使用包含数字的可选 initializer 输入参量来初始化数组。initializer 参量(即第一个位置参量)必须是 Python 序列类型,例如 listtuplerange。您可以指定 initializer 来包含多个数字序列。

  • 您可以使用包含大小为 1×N 的输入的可选 vector 输入参量来初始化数组。如果使用 vector,则不能使用 initializer

    注意

    当输入的大小为 1×N 时,使用 vector 使用 initializer 更有效。Python 始终知道一维序列的长度,并且它可以使用此信息对将保存输出的数组执行单次分配。

  • 您可以使用以下选项之一创建多维数组:

    • 指定嵌套序列而不指定大小。

    • 指定一个嵌套序列,并指定与嵌套序列的维度匹配的 size 输入参量。

    • 指定一维序列和多维大小。在这种情况下,假定序列按列主顺序表示元素。

  • 您可以通过将可选的 is_complex 输入参量设置为 True 来创建复数的 MATLAB 数组。

  • 您可以使用自定义类型在 MATLAB 中创建 Python 数组。自定义类型必须实现 Python 缓冲区协议。一个示例是 NumPy 中的 ndarray

您可以使用以下类创建 MATLAB 数组:

来自 matlab Python 包的类

Python 中的构造函数调用

示例

matlab.double

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

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

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

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

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

matlab.int64(initializer=None|vector=None,
size=None,
is_complex=False)
>>> a = matlab.int64([[11, 22, 33],[44, -55, 66]])

matlab.uint8

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

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

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

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

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 MATLAB 包中 Python 类的属性和方法

使用 matlab 包构造函数创建的所有 MATLAB 数组都具有以下属性和方法:

属性

属性名称描述示例

size

表示数组维度的整数元组

>>> a = matlab.int16([[1, 2, 3],[4, 5, 6]]) 
>>> a.size 
(2, 3)

itemsize

表示数组元素大小(以字节为单位)的整数

>>> 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]
  • reshape(dim1,dim2,...,dimN)

  • reshape((dim1,dim2,...,dimN))

  • reshape([dim1,dim2,...,dimN])

根据维度重塑数组并返回结果

>>> 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()

返回由内容构造的标准 Pythonarray.array 对象。仅适用于一维序列。

>>> 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 memoryview 对象

>>> a = matlab.int16(
[[1, 2, 3],[4, 5, 6]]) 
>>> b = a.tomemoryview() 
>>> b.tolist() 
[[1, 2, 3], [4, 5, 6]] 
>>> b.shape 
(2, 3)

创建包含 N 个元素的 MATLAB 数组

当您创建一个具有 N 元素的数组时,其大小为 1× N 因为它是一个 MATLAB 数组。

import matlab
A = matlab.int8([1,2,3,4,5])
print(A.size)

(1, 5)

初始化器是一个包含五个数字的 Python 列表。MATLAB 数组大小为 1×5,由元组 (1,5) 表示。

MATLAB 中创建多维 Python 数组

在 Python 中,您可以创建任何数值类型的多维 MATLAB 数组。使用嵌套的 Python 浮点数列表创建一个 2×5 的 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],[6.0,7.0,8.0,9.0,10.0]]

sizeA 属性表明它是一个 2×5 的数组。

print(A.size)

(2, 5)

Python 中对 MATLAB 数组进行索引

您可以对 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 索引从零开始。当您在 MATLAB 会话中访问 Python 数组的元素时,请使用从零开始的索引。

此示例说明如何对多维 MATLAB 数组进行索引。

A = matlab.double([[1,2,3,4,5], [6,7,8,9,10]])
print(A[1][2])

8.0

Python 中对 MATLAB 数组进行切片

您可以对 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,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]]

MATLAB 数组重构为 Python

您可以使用 reshape 方法在 MATLAB 中重塑 Python 数组。输入参量 size 必须是一个不会改变数组中元素数量的序列。使用 reshape 将 1×9 的 MATLAB 数组更改为 3×3。元素按照列主顺序从原始数组中取出。

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]]

使用自定义类型创建 MATLAB 数组

您可以使用 NumPy 中的自定义类型(例如 ndarray 在 MATLAB 中创建 Python 数组。自定义类型必须实现 Python 缓冲区协议。

import matlab
import numpy

nf = numpy.array([[1.1, 2,2, 3.3], [4.4, 5.5, 6.6]])
md = matlab.double(nf)
ni32 = numpy.array([[1, 2, 3], [4, 5, 6]], dtype='int32')
mi32 = matlab.int32(ni32)

另请参阅

主题