IDL/배열 생성 및 처리

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

이상우_idl 2020. 7. 30. 11:43
728x90
반응형

* 지난 회차 게시물의 내용에서 바로 이어집니다.

 

예를 들어서 배열 arr 내에서 80보다 큰 값들을 탐색해야 하는 경우를 가정해봅시다. 이러한 작업을 위해서는 다음과 같이 WHERE 함수를 사용하면 됩니다.

 

ww = WHERE(arr GT 80, count)

PRINT, count

 

           3

 

여기서는 변수 count를 통하여 얻은 값을 출력하도록 했는데, 이 값의 의미는 발생건수입니다. 즉 배열 arr 내에서 80보다 큰 값이 발생한 건수가 3개라는 뜻입니다. 그러면 그 3개의 값들이 어떤 값들인지 확인해보려면 다음과 같이 WHERE로 얻은 결과로 원래 배열 arr을 인덱싱하면 됩니다.

 

PRINT, arr[ww]

 

      91      96      90

 

그러면 해당 값들이 모두 출력됩니다. 즉 91, 96, 90이라는 것을 확인할 수 있습니다. 그러면 이 3개의 값들 각각의 위치 인덱스를 확인해보기 위하여 WHERE 함수의 결과인 ww를 출력해봅시다.

 

PRINT, ww

 

           2          10          16

 

그런데 여기서 출력된 값들을 보면 3개의 1차원적 인덱스들임을 알 수 있습니다. 즉 우리는 분명히 2차원 배열에 대하여 WHERE 함수를 사용하였지만, WHERE 함수가 전달해주는 결과 자체는 1차원적 인덱스의 형태를 갖습니다. 따라서 2, 10, 16 각각의 1차원적 인덱스가 2차원적으로는 어떤 모습인지를 확인해보는 것이 필요할 수 있습니다. 그래야 우리가 직관적으로 그 위치를 가늠할 수가 있기 때문입니다. 이를 위해서 사용되어야 하는 함수가 바로 ARRAY_INDICES 함수입니다. 앞서 얻은 3개의 1차원적 인덱스 각각에 대하여 ARRAY_INDICES 함수를 이용하여 결과를 얻어보면 다음과 같습니다.

 

ind_r = ARRAY_INDICES(arr, 2)

PRINT, ind_r

 

           2           0

 

ind_r = ARRAY_INDICES(arr, 10)

PRINT, ind_r

 

           0           2

 

ind_r = ARRAY_INDICES(arr, 16)

PRINT, ind_r

 

           1           3

 

즉 1차원 인덱스 2는 2차원 인덱스 (2, 0)에 해당되고, 1차원 인덱스 10은 2차원 인덱스 (0, 2)에 해당되고, 1차원 인덱스 16은 2차원 인덱스 (1, 3)에 해당된다는 의미입니다. 물론 ww의 모든 1차원 인덱스들에 대하여 한꺼번에 결과를 얻을 수도 있습니다.

 

inds_r = ARRAY_INDICES(arr, ww)

HELP, inds_r

PRINT, inds_r

 

INDS_R          LONG      = Array[2, 3]

           2           0

           0           2

           1           3

 

따라서 2차원 배열에 대하여 WHERE 함수로 얻은 결과를 직관적으로 해석하기 위해서는, WHERE 함수가 전달하는 1차원적 인덱스를 2차원적 인덱스로 변환하는 것이 필요할 수 있고 이 때 ARRAY_INDICES 함수를 사용하면 됩니다. 그리고 경우에 따라서는 반대 방향으로 변환하는 것이 필요할 수도 있습니다. 즉 2차원적 인덱스를 1차원적 인덱스로 변환하는 것인데요. 이러한 변환을 위해서는 간단한 변환식을 사용하면 되는데, 앞서 예를 들었던 (1, 2)라는 2차원 인덱스를 11이라는 1차원 인덱스로 변환하는 과정은 다음과 같습니다.

 

ind_i = 1

ind_j = 2

sz = SIZE(arr, /DIM)

ind = ind_j*sz[0]+ind_i

PRINT, ind

 

          11

 

여기서는 SIZE 함수를 사용하여 배열 arr의 각 차원별 크기 값을 추출하였습니다. 결과는 당연히 11로 나옵니다. 확인을 위하여 1차원 인덱스 11을 다시 2차원 인덱스로 변환하여 결과를 출력해보면 다음과 같습니다.

 

ind_r = ARRAY_INDICES(arr, ind)

PRINT, ind_r

 

           1           2

 

오늘 WHERE 함수로 얻은 결과를 지난 회 게시물의 그림을 이용하여 도식적으로 나타내면 다음 그림과 같습니다. 상단은 배열 arr의 값들이고 하단은 1차원적 인덱스들입니다. WHERE 함수로 찾아낸 값들 및 해당 인덱스들을 붉은 네모로 표시하였습니다.

 

 

사실 오늘 언급한 내용은 2차원 배열 뿐만 아니라 3차원 등 다차원 배열에 대해서도 공통적으로 적용됩니다. 즉 다차원 배열에 대한 다차원적 인덱스와 1차원적 인덱스 사이의 대응 관계는 항상 존재합니다. 1차원 인덱스를 다차원 인덱스로 변환하는 것은 앞서 소개한 ARRAY_INDICES 함수를 사용하여 얼마든지 가능합니다. 그리고 반대로 다차원 인덱스를 1차원 인덱스로 변환하는 것도 가능한데, 2차원->1차원의 경우에서 개념이 확장되는 것이라 변환식이 좀 더 길어지는 것 뿐입니다. 다만 이번에 소개하는 내용에서는 어차피 2차원 배열에 관한 얘기로 한정짓기로 했으므로 이 정도까지만 언급하기로 합니다.

 

이제 2차원 배열의 인덱스 체계와 관련하여 한 회 정도 더 얘기할 내용이 남은 것 같습니다. 이 내용은 다음 회차에서 소개하기로 하고 오늘은 여기서 마치겠습니다.

 

반응형