상위 목록: 하위 목록: 작성 날짜: 읽는 데 11 분 소요

메모리 레이아웃(Memory Layout)

메모리 레이아웃이란 Numpy 배열의 요솟값 정렬 방식을 의미합니다.

다차원 배열의 요솟값 정렬 방식은 크게, 행 우선(Column-Major) 방식과 열 우선(Row-Major) 방식이 있습니다.

행 우선 방식은 첫 번째 행을 메모리에 넣은 다음 두 번째 행을 메모리에 넣습니다.

열 우선 방식은 첫 번째 열을 메모리에 넣은 다음 두 번째 열을 메모리에 넣습니다.

이런 방식으로 행 또는 열의 순서대로 메모리 레이아웃의 구조가 형성됩니다.



행 우선(Column-Major)

행 우선 방식은 위 그림과 같이 행 인덱스가 가장 낮으면서, 열 인덱스가 높아지는 순서로 정렬됩니다.

즉, 가장 빠르게 변화하는 색인의 순서로 할당됩니다. 행 우선 방식은 C 언어 스타일의 메모리 순서입니다.

만약, 3차원 배열일 때 [i][j][k] 형태로 색인이 구성돼 있다면 k의 값부터 순차적으로 증가하고, k 색인이 최댓값에 도달하면 j 색인이 증가하는 구조입니다.

메모리 레이아웃 구조를 볼 때, 행 요소는 한 번씩만 변화합니다.



열 우선(Row-Major)

열 우선 방식은 위 그림과 같이 열 인덱스가 가장 낮으면서, 행 인덱스가 높아지는 순서로 정렬됩니다.

즉, 가장 느리게 변화하는 색인의 순서로 할당됩니다. 열 우선 방식은 Fortran 언어 스타일의 메모리 순서입니다.

만약, 3차원 배열일 때 [i][j][k] 형태로 색인이 구성돼 있다면 i의 값부터 순차적으로 증가하고, i 색인이 최댓값에 도달하면 j 색인이 증가하는 구조입니다.

메모리 레이아웃 구조를 볼 때, 열 요소는 한 번씩만 변화합니다.



Numpy의 메모리 레이아웃

import numpy as np

array = np.arange(10)

print(array)

arrayC = np.reshape(array, (2, -1), order='C')
arrayF = np.reshape(array, (2, -1), order='F')

print(arrayC)
print(arrayF)
결과
[0 1 2 3 4 5 6 7 8 9]
[[0 1 2 3 4]
 [5 6 7 8 9]]
[[0 2 4 6 8]
 [1 3 5 7 9]]

Numpy 배열에서는 order 매개변수의 인수를 통해 메모리 레이아웃을 설정할 수 있습니다.

arrayCC 언어 스타일의 정렬 방식을 가지며, arrayFFortran 언어 스타일의 정렬 방식을 갖습니다.

Numpy 배열은 C 언어 스타일Fortran 언어 스타일로 정렬할 수 있습니다.

하지만, 크게 본다면 네 종류의 값으로 메모리 레이아웃을 정렬할 수 있습니다.

추가로 포함되는 두 종류의 값은 자동으로 C 언어 스타일에 맞출지, Fortran 언어 스타일에 맞출지 정렬하는 옵션입니다.

위의 예제 코드에서 확인할 수 있듯이, 정렬 방식에 따라 반환되는 값이 달라지는 것을 확인할 수 있습니다.



메모리 레이아웃 정렬 플래그

order 의미
‘K’ 레이아웃에 최대한 일치
‘A’ Fortran에 근접한 경우 ‘F’, 아닐 경우 ‘C’
‘C’ C 언어 스타일
‘F’ Fortran 언어 스타일

댓글 남기기