matlab
の Python モジュール
matlab
の Python® モジュールには、MATLAB® 数値型の配列を Python 変数として表すクラスがあります。これらのクラスを使用して、Python と MATLAB の間で MATLAB 配列を渡すことができます。
matlab
の Python モジュール内の MATLAB クラス
matlab
の Python パッケージをインポートして必要なコンストラクターを呼び出すことにより、Python コード内で MATLAB の数値配列を使用できます。以下に例を示します。
import matlab a = matlab.double([[1, 2, 3],[4, 5, 6]])
配列コンストラクターは次のようにカスタマイズできます。
数値を含むオプションの入力引数
initializer
を使用して、配列を初期化できます。最初の位置引数である引数initializer
は、list
、tuple
、またはrange
などの Python シーケンス型でなければなりません。initializer
を指定して、複数の数値シーケンスを含めることができます。サイズが 1 行 N 列の入力を含むオプションの入力引数
vector
を使用して、配列を初期化できます。vector
を使用する場合、initializer
は使用できません。メモ
入力のサイズが 1 行 N 列の場合は、
initializer
を使用するよりもvector
を使用した方が効率的です。Python では 1 次元のシーケンスの長さが常にわかっているため、この情報を使用して、出力を保持する配列の割り当てを一度に実行できます。次のいずれかのオプションを使用して、多次元配列を作成できます。
サイズを指定せずに入れ子にされたシーケンスを指定する。
入れ子にされたシーケンスを指定し、入れ子にされたシーケンスの次元と一致する
size
入力引数も指定する。1 次元のシーケンスを多次元のサイズと共に指定する。この場合、シーケンスは要素を列優先の順序で表していると見なされます。
オプションの入力引数
is_complex
をTrue
に設定することで、複素数の MATLAB 配列を作成できます。Python でカスタム型を使用して MATLAB 配列を作成できます。このカスタム型は、Python バッファー プロトコルを実装している必要があります。1 つの例として 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
パッケージ コンストラクターで作成されたすべての 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) |
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]]
A
の size
属性は、これが 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)