最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

Python 変数としての MATLAB 配列

matlab Python® パッケージは、Python 変数として MATLAB® 数値型の配列を表す配列クラスを提供するので、MATLAB 配列を Python と MATLAB の間で渡すことができます。

Python での MATLAB 配列の作成

Python セッションで MATLAB 数値配列を作成するには、matlab Python パッケージ (たとえば、matlab.doublematlab.int32) からコンストラクターを呼び出します。コンストラクターの名前は、MATLAB 数値型を示します。

Python 内での MATLAB double 配列の初期化には、カスタム型を使用できます。カスタム型は、初期化子として使用するには Python 抽象基底クラス collections.Sequence から継承する必要があります。

MATLAB 配列を入力引数として Python 用 MATLAB エンジン API で呼び出された関数に渡すことができます。MATLAB 関数が出力引数として数値配列を返すと、エンジンはその配列を Python に返します。

その配列は、数値を含む initializer 入力引数 (オプション) で初期化できます。initializer は、listtuple、他のシーケンス型などの Python シーケンス型でなければなりません。オプションの size 入力引数は、シーケンスから配列サイズを設定します。多次元配列は、initializer を指定して複数の数字シーケンスを含めるか、size を多次元となるように指定することで作成できます。複素数の MATLAB 配列は、オプションの is_complex 入力引数を True に設定すると作成できます。matlab パッケージは、次の表に一覧表示されている MATLAB 配列コンストラクターを提供します。

matlab クラス

Python でのコンストラクターの呼び出し

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)

matlab.int16

matlab.int16(initializer=None, size=None, is_complex=False)

matlab.int32

matlab.int32(initializer=None, size=None, is_complex=False)

matlab.int64[a]

matlab.int64(initializer=None, size=None, is_complex=False)

matlab.uint8

matlab.uint8(initializer=None, size=None, is_complex=False)

matlab.uint16

matlab.uint16(initializer=None, size=None, is_complex=False)

matlab.uint32

matlab.uint32(initializer=None, size=None, is_complex=False)

matlab.uint64[b]

matlab.uint64(initializer=None, size=None, is_complex=False)

matlab.logical

matlab.logical(initializer=None, size=None)[c]

matlab.object

コンストラクターなし。関数がハンドルまたは値オブジェクトを MATLAB オブジェクトに返すと、エンジンは matlab.object を Python に返します。

[a] In Python 2.7 on Windows, matlab.int64 is converted to int32 in MATLAB. Also, MATLAB cannot return an int64 array to Python.

[b] In Python 2.7 on Windows, matlab.uint64 is converted to uint32 in MATLAB. Also, MATLAB cannot return a uint64 array to Python.

[c] Logicals cannot be made into an array of complex numbers.

N 個の要素をもつ配列を作成すると、MATLAB 配列であるため、サイズは 1 行 N 列になります。

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

初期化子は、5 つの数値を含む Python list です。MATLAB 配列のサイズは 1 行 5 列で、(1,5)tuple で示されます。

Python での MATLAB 配列の属性とメソッド

matlab パッケージ コンストラクターで作成されたすべての MATLAB 配列は、この表に記載されている属性とメソッドをもちます。

属性またはメソッド

目的

size

tuple として返された配列のサイズ

reshape(size)

シーケンス size で指定された配列の形状変更

Python における多次元の MATLAB 配列

Python では、任意の数値型の多次元の MATLAB 配列を作成できます。2 つの Python list 変数を使用して、2 行 5 列で double の 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]]

Asize 属性は、それが 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 配列のスライス

MATLAB 配列は、Python の list 変数と tuple 変数をスライスするのと同じ方法でスライスできます。

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 iterable からのデータを割り当てることができます。

次に示すようにスライスを指定して割り当てることができます。

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 list のスライスとは異なった動作をします。MATLAB 配列をスライスすると、シャロー コピーではなくビューを返します。

同じ値で MATLAB 配列と Python list を指定してスライスを割り当てると、次のコードで示されるように異なる結果となります。

A = matlab.int32([[1,2],[3,4],[5,6]])
L = [[1,2],[3,4],[5,6]]
A[0] = A[0][::-1]
L[0] = L[0][::-1]
print(A)
[[2,2],[3,4],[5,6]]
print(L)
[[2, 1], [3, 4], [5, 6]]

Python における MATLAB 配列の形状変更

Python で reshape メソッドを使用して 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]]

関連するトピック