Main Content

matlabPython モジュール

matlab の Python® モジュールには、Python と MATLAB® 間で MATLAB 配列を渡すことができるように、MATLAB 数値型の配列を Python 変数として表す配列クラスがあります。

matlab Python モジュール内の MATLAB クラス

  • matlab の Python パッケージをインポートして必要なコンストラクターを呼び出すことにより、Python コード内で MATLAB の数値配列を使用できます。以下に例を示します。

    import matlab
    a = matlab.double([[1, 2, 3],[4, 5, 6]]) 
    コンストラクターの名前は、MATLAB 数値型を示します。Python から呼び出される MATLAB 関数に、入力引数として MATLAB 配列を渡すことができます。MATLAB 関数から出力引数として数値配列が返されると、この配列が Python に返されます。

  • 数値を含むオプションの入力引数 initializer を使用して、配列を初期化できます。引数 initializer は、listtuple、または range などの Python シーケンス型でなければなりません。initializer を指定して、複数の数値シーケンスを含めることができます。

  • サイズが 1 行 N 列の入力を含むオプションの入力引数 vector を使用して、配列を初期化できます。vector を使用する場合、initializer は使用できません。

  • 次のいずれかのオプションを使用して、多次元配列を作成できます。

    • サイズを指定せずに入れ子にされたシーケンスを指定する。

    • 入れ子にされたシーケンスを指定し、入れ子にされたシーケンスの次元と一致する size 入力引数も指定する。

    • 1 次元のシーケンスを多次元のサイズと共に指定する。この場合、シーケンスは要素を列優先の順序で表していると見なされます。

  • オプションのキーワード引数 is_complexTrue に設定することで、複素数からなる MATLAB 配列を作成できます。

  • Python でカスタム型を使用して、MATLAB 配列を初期化できます。このカスタム型は、Python バッファー プロトコルを実装している必要があります。1 つの例として NumPy の ndarray があります。

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.

matlabPython パッケージ内にある MATLAB クラスのプロパティとメソッド

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

内容から作成した標準の Python array.array オブジェクトを返す。1 次元のシーケンスにのみ適用可能。

>>> 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 個の要素をもつ配列を作成する場合、これは MATLAB 配列であるため、サイズは 1 行 N 列になります。

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

(1, 5)

初期化子は、5 個の数値を含む Python リストです。MATLAB 配列のサイズが 1 行 5 列であることが、(1,5) というタプルで示されています。

Python での多次元 MATLAB 配列

Python では、任意の数値型の多次元 MATLAB 配列を作成することができます。入れ子にされた Python の浮動小数点リストを使用して、2 行 5 列の 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],[6.0,7.0,8.0,9.0,10.0]]

Asize 属性は、これが 2 行 5 列の配列であることを示します。

print(A.size)

(2, 5)

Python での MATLAB 配列へのインデックス付け

Python のリストとタプルにインデックスを付けることができるのと同様に、MATLAB 配列にもインデックスを付けることができます。

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 配列をスライスすることができます。

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

Python での MATLAB 配列の形状変更

Python で reshape メソッドを使って MATLAB 配列の形状を変更することができます。入力引数 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 などのカスタム型を使用して、Python で MATLAB 配列を初期化できます。このカスタム型は、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)

関連するトピック