IDL/배열 생성 및 처리

2차원 배열의 인덱스 체계의 이해 및 활용 [1]

이상우_idl 2020. 7. 27. 21:12
728x90
반응형

오늘은 IDL에서 정의되는 2차원 배열의 인덱스 체계에 관하여 알아보고자 합니다. 구체적으로는 IDL에서 사용되는 2차원 배열의 인덱싱 방식에 대한 기본적인 방식에 대하여 관련 예제들과 함께 살펴보고, 이와 연관되는 주제로서 WHERE, ARRAY_INDICES 등의 함수에 대한 얘기도 이어서 해볼 예정입니다. 어떻게 보면 보면 뻔한 얘기가 될 수도 있지만, 사실 유저 입장에서는 다소 혼동될만한 부분도 있기 때문에 이번 기회에 한번 다뤄보도록 하겠습니다. 아마도 2~3회 정도로 나눠서 진행하게 될 것 같습니다.

 

그러면 먼저 예제로 사용할 2차원 배열을 정의해봅시다. 다음과 같이 RANDOMU 함수를 이용하여 5x4의 구조를 갖는 2차원 배열을 정의하고 관련 정보들을 출력합니다.

 

arr = FIX(RANDOMU(-1, 5, 4)*100)

HELP, arr

PRINT, arr

 

PRINT와 HELP에 의하여 출력된 내용은 다음과 같습니다.

 

ARR             INT       = Array[5, 4]

       9      11      91      56      78

      52      78      77       1      28

      96      50      59      69      14

      69      90      17      55      65

 

이와 같이 배열 arr은 5x4의 형태로 총 20개의 정수형 값들로 구성되어 있습니다. 이 20개의 값들 중 50이라는 값이 있습니다. 이 값에 접근하려면 배열 arr에 대하여 적절한 인덱스를 부여해야 합니다. 실제로 50이라는 값의 배열 arr 내 인덱스는 (1, 2)입니다. 그래서 다음과 같이 이 인덱스에 해당되는 값을 출력해보면 실제로도 50이라는 값이 출력됩니다.

 

ind_i = 1

ind_j = 2

PRINT, arr[ind_i, ind_j]

 

      50

 

여기서 50이라는 값의 위치 인덱스가 (1, 2)인 이유는 아마 IDL 유저들이라면 다들 아실 것이라고 믿습니다. 이 값의 위치가 arr이라는 배열의 구조 내에서 X 방향으로 두번째 그리고 Y 방향으로 세번째에 해당되고 이를 배열 인덱스로 표현하면 (1, 2)가 되기 때문입니다. 앞서 배열 arr의 모든 값들을 출력해본 바 있는데, 20개의 모든 값들 각각에 대하여 2차원적인 배열 인덱스를 부여하는 체계는 다음과 같습니다.

 

 

즉 이 그림에서 i 방향으로 0부터 시작하는 인덱스가 정의되고 또 j 방향으로 0부터 시작하는 인덱스가 정의되어서 이 두 인덱스를 합친 (i, j)라는 2차원적 인덱스를 사용하여 배열 내에서 값의 위치를 정의합니다. 이러한 요령으로 따진다면 78이라는 값은 위치 인덱스가 (1, 1)이 될 것이고 17이라는 값은 (2, 3)이 될 것입니다. 아무래도 arr이 2차원 배열이므로 이 배열 내의 값을 접근하는데 있어서 2차원적인 인덱스를 사용하는 것은 당연합니다.

 

그런데 배열 arr에서 50이라는 값에 접근하는데 있어서 (1, 2)라는 2차원적인 인덱스 대신 1차원적인 인덱스를 사용하는 것도 가능합니다. 2차원 배열을 인덱싱하는데 1차원적인 인덱스를 사용한다는 것이 다소 이상하게 보일 수도 있지만 실제로 그렇습니다. 값 50의 위치는 2차원적인 인덱스로는 (1, 2)이지만 1차원적인 인덱스로는 11이 됩니다. 1차원 인덱스로 11이 되는 이유는 잠시후에 보기로 하고 일단 확인부터 해봅시다.

 

ind = 11

PRINT, arr[ind]

 

      50

 

즉 2차원 배열 arr 내에 있는 50이라는 값을 접근하기 위해서는 (1, 2)라는 2차원적 인덱스를 사용해도 되지만 11이라는 1차원적 인덱스를 사용해도 된다는 것입니다. 실제로 (1, 2)와 11 사이의 관계는 다음과 같습니다.

 

11 = 2*5+1

 

여기서 2는 (1, 2)의 두번째 값이고 1은 (1, 2)의 첫번째 값이고 5는 배열 arr의 X 방향 크기입니다. 즉 이 얘기는 2차원 배열에 대한 1차원적 인덱스는 X 방향 우선으로 순차적으로 진행되는 순서를 따라 매겨지는 체계를 따른다는 뜻입니다. 말로 하면 좀 복잡해 보일 수도 있는데, 도식적으로 표현하면 다음 그림과 같습니다.

 

 

이와 같이 2차원 배열에 대한 1차원적 인덱스가 X 방향 (또는 가로 방향) 우선으로 순차적으로 진행되는 경우를  Column-Major라고 합니다. 물론 Column-Major가 있다는 것은 Row-Major라는 개념도 존재한다는 의미이긴 합니다. 다만 IDL의 2차원 배열은 Column-Major 방식을 따릅니다. 물론 이러한 특성은 프로그래밍 언어마다 다를 수 있습니다. 이와 관련된 더 깊고 자세한 내용은 IDL 도움말 내에서도 소개가 되어 있으므로 궁금하신 분들은 IDL 도움말에서 다음 섹션의 내용을 참조하시기 바랍니다.

 

IDL > Language > Arrays > Columns, Rows, and Array Majority

 

그런데 이와 같이 2차원 배열에 대한 인덱싱을 하는데 있어서는 아무래도 2차원적인 인덱스를 사용하는 것이 더 직관적인 것이 사실입니다. 즉 2차원적으로 (1, 2)라고 표현하면 그 위치가 어디인지에 대하여 금방 인지를 할 수 있습니다. 하지만 11이라는 1차원적인 인덱스를 사용하게 되면, 2차원 배열 내에서 이 인덱스가 가리키는 위치가 어디인지를 바로 가늠하는 것이 그리 쉽지는 않습니다. 그래서 이러한 1차원적인 인덱싱 방식이 과연 필요한가 또 굳이 알아야 하는가에 대한 의문이 생길 수도 있습니다. 사실 뭐 모른다고 해서 큰 일이 나는 것은 아니지만, 알고 있는 것이 더 좋을 수도 있고 반드시 이해해야 하는 경우도 있을 수 있습니다. 대표적인 케이스가 바로 WHERE 함수를 사용하는 경우입니다.

 

그러면 이러한 경우에 관해서는 다음 회차 게시물에서 자세히 살펴보기로 하고 오늘은 일단 여기서 마치겠습니다.

 

반응형