IDL/배열 생성 및 처리

배열 사이의 비교 (ARRAY_EQUAL 및 기타)

이상우_idl 2018. 10. 12. 11:45
728x90
반응형

오늘은 배열과 배열을 비교하는 방법에 관하여 알아보고자 합니다. 두개의 배열이 서로 동일한가 아닌가를 판단하는데 있어서 가장 간단하게 사용할 수 있는 방법은 ARRAY_EQUAL 함수를 사용하는 것입니다. 다음과 같이 배열 a와 b가 정의되어 있다고 합시다. 물론 두 배열은 보시다시피 서로 완벽하게 동일합니다.


IDL> a = [3, 4, 6, 8]

IDL> b = [3, 4, 6, 8]


이 때 다음과 같이 ARRAY_EQUAL 함수를 사용하여 두 배열을 비교하면 1이란 값이 출력됩니다. 즉 두 배열이 서로 동일하다는 의미입니다.


IDL> PRINT, ARRAY_EQUAL(a, b)

   1


만약 다음과 같이 두 배열이 서로 동일하지 않을 경우에는 ARRAY_EQUAL에 의하여 0이란 값이 출력됩니다. 즉 두 배열이 서로 동일하지 않다는 의미입니다.


IDL> a = [3, 4, 6, 8]

IDL> b = [3, 4, 6, 9]

IDL> PRINT, ARRAY_EQUAL(a, b)

   0


그런데 만약 다음과 같이 두 배열이 크기는 다르지만 앞부분만 서로 동일한 경우도 있습니다.


IDL> a = [3, 4, 6, 8]

IDL> b = [3, 4, 6, 8, 9, 12, 14]


이럴 경우에는 ARRAY_EQUAL은 다음과 같이 두 배열이 서로 다르다고 판정합니다.


IDL> PRINT, ARRAY_EQUAL(a, b)

   0


그런데 다음과 같이 DIFFERENT_LENGTHS라는 키워드를 함께 사용하면 두 배열이 서로 동일하다고 판정하게 됩니다.


IDL> PRINT, ARRAY_EQUAL(a, b, /DIFFERENT_LENGTHS)

   1


여기서 사용된 DIFFERENT_LENGTHS 키워드의 역할은 비교 대상이 되는 두 배열이 크기가 다를 경우 작은 크기의 배열의 인덱스들만을 대상으로 판단하게 하는 것입니다. 따라서 크기가 더 작은 배열인 a에서 존재하는 인덱스들(0, 1, 2, 3)만을 비교의 대상으로 간주하게 됩니다(참고로 이 키워드는 IDL 8.7.1 버전에서 새로 추가된 키워드입니다).


그런데 ARRAY_EQUAL 함수에는 배열 뿐 아니라 단일값(Scalar)도 인수로 사용하는 것이 가능합니다. 즉 다음과 같이 배열과 단일값을 서로 비교하는 것도 가능합니다.


IDL> a = [5, 5, 5, 5]

IDL> PRINT, ARRAY_EQUAL(a, 5)

   1

IDL> PRINT, ARRAY_EQUAL(a, 6)

   0


즉 이와 같이 어떤 배열의 구성원소들이 모두 동일한 값들로 구성되어 있을 때 의미있는 방법이라고 볼 수 있습니다. 따라서 배열 내에 하나라도 다른 값이 있을 경우에는 위와 같은 방법은 큰 의미는 없게 됩니다.


IDL> a = [5, 5, 6, 5]

IDL> PRINT, ARRAY_EQUAL(a, 5)

   0

IDL> PRINT, ARRAY_EQUAL(a, 6)

   0


그리고 함수의 이름이 좀 무색해지는 감도 있지만, 다음과 같이 단일값과 단일값 사이의 비교도 가능합니다.


IDL> PRINT, ARRAY_EQUAL(5, 5)

   1

IDL> PRINT, ARRAY_EQUAL(5, 6)

   0


물론 이런 경우에는 다음과 같이 그냥 논리연산자 EQ를 사용하는 것이 더 간단할 것으로 생각됩니다.


IDL> PRINT, 5 EQ 5

   1

IDL> PRINT, 5 EQ 6

   0


여기서 한 걸음만 더 들어가본다면, 배열과 배열 사이의 비교에서도 그냥 ARRAY_EQUAL 함수를 사용하는 대신에 그냥 EQ 연산자를 사용할 수도 있습니다. 즉 앞서 이미 봤던 다음과 같은 예제에서는 ARRAY_EQUAL 함수를 사용하면 그냥 두 배열이 서로 다르다는 결과만 얻게 됩니다.


IDL> a = [5, 5, 5, 5]

IDL> b = [5, 5, 6, 5]

IDL> PRINT, ARRAY_EQUAL(a, b)

   0


그런데 만약 EQ 연산자를 사용하면 다음과 같은 결과를 얻게 됩니다.


IDL> a = [5, 5, 5, 5]

IDL> b = [5, 5, 6, 5]

IDL> PRINT, a EQ b

   1   1   0   1


즉 이 결과는 두 배열을 서로 비교하여 값이 일치하지 않는 인덱스가 어디인지도 알려주는 역할을 합니다. 따라서 이러한 결과에 대하여 다음과 같이 WHERE 함수를 추가로 적용하면, 두 배열 사이의 구성원소 값이 서로 일치하지 않는 위치 인덱스까지도 산출할 수 있습니다.


IDL> result = a EQ b

IDL> ww = WHERE(result EQ 0)

IDL> PRINT, ww

           2


그래서 정리해보면, 두 배열이 동일한가 여부 자체에만 관심이 있다면 ARRAY_EQUAL을 사용하는 것만으로 충분하지만, 두 배열 사이의 차이가 정확히 어디에서 발생하는가에 대해서까지 알아내야 할 경우라면 EQ 연산자와 WHERE 함수를 이용하면 됩니다.

반응형