IDL/배열 생성 및 처리

ARRAY_INDICES 함수를 이용하여 다차원 배열에서 특정 값의 위치 인덱스 찾기

이상우_idl 2012. 9. 28. 14:09
728x90
반응형

IDL에서 어떤 배열의 원소값들중에서 특정한 값의 배열상의 위치, 즉 인덱스(index)를 찾는 것은 WHERE 함수를 사용하면 매우 쉽게 해결이 된다는 것은 잘 알려진 사실입니다. 그런데 배열이 1차원이 아닌 2차원, 3차원 또는 그 이상인 다차원 배열에서 이와 같은 방법으로 위치를 찾으면 그 위치는 항상 단일값으로 나옵니다. 차원의 갯수에 맞는 위치좌표가 아닌 상태로 말이지요. 예를 들면 다음과 같이 5X5의 구조를 갖는 a라는 2차원 배열이 있다고 합시다.


          42           9          76          53          93

          38          65           7          72          67

          38          63          88          52          65

          24          26          76          75          91

           7          27          90          27          52


이 배열에서 가장 큰 값을 확인해보면 93이 최대값임을 알 수 있습니다.


IDL> PRINT, MAX(a)

          93


그러면 최대값의 배열상의 위치를 확인하기 위하여 다음과 같이 WHERE 함수를 사용해봅시다.


IDL> ind = WHERE(a EQ MAX(a))

IDL> PRINT, ind

           4


그러면 결과값은 4로 출력이 됩니다. 그런데 우리가 원하는 것은 2차원 배열 a에서의 위치이므로 (x, y)와 같은 좌표를 얻고 싶은데, 정작 값은 그냥 1차원 값으로만 얻어집니다. 이것은 배열이 차원이 몇이든간에 특정 위치에 대한 좌표는 IDL 내부적으로는 1차원 값으로 인식을 하는데, WHERE 함수는 이러한 값을 주는 것이 디폴트 설정이기 때문입니다. 따라서 WHERE 함수로 얻은 결과에 대하여 한 단계만 더 거쳐주면 우리가 알아볼 수 있는 좌표값을 얻을 수 있는데, 이 때 ARRAY_INDICES라는 함수를 사용합니다. 사용법은 다음과 같습니다.


IDL> PRINT, ARRAY_INDICES(a, ind)

           4           0


이렇게 하면 (4, 0)이라는 2차원 좌표의 형태로 93이라는 값의 배열상의 위치를 확인할 수 있습니다. ARRAY_INDICES 함수에는 필수적으로 두 인자가 들어가는데, 첫번째 인자는 원래 배열의 이름이 되어야 하고 두번째 인자는 WHERE 함수로 얻은 인덱스로 넣어주면 됩니다.


만약 배열상에서 위치를 원하는 값이 하나 이상이어도 사용법은 같습니다. 예를 들어, 같은 a라는 배열에 대해서 이번에는 최소값을 다음과 같이 찾아보면 7이란 값으로 확인됩니다.


IDL> PRINT, MIN(a)

           7


그런데 WHERE 함수로 최소값의 위치를 찾아보면 다음과 같이 두 개의 인덱스가 나옵니다. 앞에서 실제로 눈으로 봐도 확인이 가능합니다.


IDL> PRINT, ind

           7          20


그러면 각 인덱스에 대한 2차원 좌표를 얻기 위해서는 마찬가지로 다음과 같이 ARRAY_INDICES 함수를 사용하면 됩니다. 다만 이번 경우에는 인덱스가 두개이므로 (x, y)좌표도 두개가 나오게 되겠죠.


IDL> PRINT, ARRAY_INDICES(a, ind)

           2           1

           0           4


그래서 ARRAY_INDICES 함수는 WHERE로 확인된 다차원 배열의 인덱스를 우리가 알아볼 수 있는 똑같은 차원의 좌표의 형태로 확인할 때 사용하면 됩니다. 그러나 WHERE로 얻은 인덱스를 직접 눈으로 확인하지 않고 그냥 후속 작업에 바로 투입하여 사용하게 되는 경우라면 굳이 ARRAY_INDICES 함수가 등장할 필요는 없습니다. 예를 들면 다음과 같이 최대값에 해당되는 위치의 값을 다른 값으로 치환해주기만 하면 되는 경우라면 말입니다.


IDL> ind = WHERE(a EQ MAX(a))

IDL> a[ind] = 100

IDL> PRINT, a

          42           9          76          53         100

          38          65           7          72          67

          38          63          88          52          65

          24          26          76          75          91

           7          27          90          27          52


따라서 ARRAY_INDICES 함수는 작업의 과정에서 내가 정말 그 위치의 좌표를 내가 알아볼 수 있는 위치좌표의 형태로 얻는 것이 필요한지 아닌지를 잘 판단해서 사용하시면 되겠습니다.

반응형