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]])
다음과 같이 배열 생성자를 사용자 지정할 수 있습니다.
숫자를 포함하는 선택적
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 배열을 만들 수 있습니다.
| 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.engine
패키지 생성자를 사용하여 생성된 모든 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) |
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]]
A
의 size
특성은 이 배열이 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]]