Main Content

MATLAB 배열을 Python 변수로 표현하기

matlab Python® 모듈은 MATLAB® 숫자형 배열을 Python 변수로 나타낼 수 있는 배열 클래스를 제공하여, Python과 MATLAB 간에 MATLAB 배열을 전달할 수 있도록 합니다.

matlab.engine Python 모듈의 MATLAB 클래스

matlab.engine Python 패키지를 가져온 후 필요한 생성자를 호출하여 Python 코드에서 MATLAB 숫자형 배열을 사용할 수 있습니다. 예를 들면 다음과 같습니다.

import matlab.engine
a = matlab.double([[1, 2, 3],[4, 5, 6]]) 
생성자의 이름은 MATLAB 숫자형을 나타냅니다. Python에서 호출된 MATLAB 함수에 MATLAB 배열을 입력 인수로 전달할 수 있습니다. MATLAB 함수가 출력 인수로 숫자형 배열을 반환할 경우, 이 배열은 Python에 반환됩니다.

다음과 같이 배열 생성자를 사용자 지정할 수 있습니다.

  • 숫자를 포함하는 선택적 initializer 입력 인수로 배열을 초기화할 수 있습니다. 첫 번째 위치 인수인 initializer 인수는 Python 시퀀스 유형(예: list, tuple 또는 range)이어야 합니다. 여러 개의 숫자 시퀀스를 포함하도록 initializer를 지정할 수 있습니다.

  • 크기가 1×N인 입력값을 포함하는 선택적 vector 입력 인수로 배열을 초기화할 수 있습니다. vector를 사용하는 경우 initializer를 사용할 수 없습니다.

    참고

    입력값의 크기가 1×N인 경우 initializer보다 vector를 사용하는 것이 더 효율적입니다. Python은 항상 1차원 시퀀스의 길이를 알고 있으며, 이 정보를 사용하여 출력값을 유지할 배열의 단일 할당을 수행할 수 있습니다.

  • 다음 옵션 중 하나를 사용하여 다차원 배열을 만들 수 있습니다.

    • 크기를 지정하지 않고 중첩 시퀀스를 지정합니다.

    • 중첩 시퀀스를 지정하고, 중첩 시퀀스의 차원과 일치하는 size 입력 인수도 지정합니다.

    • 다차원 크기와 함께 1차원 시퀀스를 지정합니다. 이 경우 시퀀스는 열 우선 순서로 요소를 표현한 것으로 간주됩니다.

  • 선택 사항인 is_complex 입력 인수를 True로 설정하여 복소수로 구성된 MATLAB 배열을 만들 수 있습니다.

  • Python에서 MATLAB 배열을 만들기 위해 사용자 지정 유형을 사용할 수 있습니다. 사용자 지정 유형은 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 Python 패키지의 MATLAB 클래스에 대한 속성 및 메서드

matlab.engine 패키지 생성자를 사용하여 생성된 모든 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)

Python에서의 다차원 MATLAB 배열

Python에서 임의의 숫자형으로 구성된 다차원 MATLAB 배열을 만들 수 있습니다. 두 개의 Python list 변수를 사용하여 double형으로 구성된 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]]

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 배열 슬라이싱

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 이터레이블(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]]

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

관련 항목