오늘은 배열 합치기(Array Concatenation)에 관하여 살펴보고자 합니다. 이것은 어떤 배열이 있을 때 또 다른 배열을 합쳐서 더 큰 배열을 만드는 작업을 의미합니다. 이게 영문으로는 Concatenation이라고 하는데, 단어상으로는 '연결'이라는 의미이기도 합니다만, 여기서는 '합치기'라는 용어로 불러보겠습니다. 사실 배열과 배열을 합친다는 개념 자체는 그리 어려운 것은 아닙니다. 다만 그런 작업을 할 경우에 어떤 문법을 따라야 하느냐가 관건입니다. 특히나 차원이 높은 배열일 경우에는 그 문법이 복잡한 측면이 있습니다. 그러면 배열의 차원별로 알아보겠습니다.
< 1차원 배열 >
1차원 배열의 경우는 그 과정이 비교적 단순한 편입니다. 먼저 다음과 같이 5개의 원소값들로 구성된 a라는 배열이 있다고 가정합니다.
a = [14, 27, 6, 11, 19]
그리고 다음과 같이 3개의 원소값들로 구성된 b라는 배열이 또 있다고 합시다.
b = [8, 20, 13]
이제 배열 a와 b를 합쳐서 c라는 배열로 만들어봅시다. 일단 이 과정을 도식적으로 본다면 다음 그림과 같습니다.
실제로 이 작업은 다음과 같이 처리하면 됩니다.
c = [a, b]
HELP, c
PRINT, c
출력된 결과를 보면 c는 8개의 원소값들로 구성된 배열로 합쳐졌음을 알 수 있습니다.
C INT = Array[8]
14 27 6 11 19 8 20 13
그런데 만약 새로 추가될 배열이 위와 같이 b라고 미리 정의된 것이 아니고 그냥 내가 직접 원소값들을 표기해야 할 경우도 있습니다. 예를 들어 위의 과정은 다음과 같이 처리해도 됩니다.
c = [a, [8, 20, 13]]
여기서는 추가될 배열을 [8, 20, 13]이라고 직접 적어준 것입니다. 그런데 사실 다음과 같이 적어도 결과는 마찬가지입니다.
c = [a, 8, 20, 13]
따라서 추가될 배열에 대하여 꺽쇠괄호 표기를 하는 것이 의무적이지는 않습니다. 이 부분은 작업자의 편의에 따라 선택적으로 처리하면 될 것 같습니다.
< 2차원 배열 >
1차원 배열과는 달리 2차원 배열부터는 문법이 약~~간 복잡해집니다. 일단 다음과 같이 4x3의 구조를 갖는 a라는 배열이 있다고 가정합니다.
a = [[34, 55, 19, 28], [26, 40, 7, 31], [17, 24, 10, 61]]
HELP, a
PRINT, a
이 배열은 다음과 같은 모습입니다.
34 55 19 28
26 40 7 31
17 24 10 61
그런데 여기에 추가될 b라는 배열이 어떤 형태가 될 것인가를 고려할 필요가 있습니다. 일단 다음과 같이 4x2의 구조를 갖는 b라는 배열이 있다고 합시다.
b = [[41, 12, 20, 9], [6, 15, 37, 28]]
HELP, b
PRINT, b
이 배열은 다음과 같은 모습입니다.
41 12 20 9
6 15 37 28
그러면 a와 b를 합쳐봅시다. 다만 여기서 고려해야 할 것은 4x3 배열과 4x2 배열을 합친다는 것은 결국 두번째 차원끼리 합쳐져서 4x5의 배열이 되도록 해야 한다는 것입니다. 즉 행(Column) 방향으로 크기가 더 커지는 효과가 됩니다. 일단 이 과정을 도식적으로 보면 다음 그림과 같습니다.
실제로 이러한 처리는 다음과 같이 하면 됩니다.
c = [[a], [b]]
HELP, c
PRINT, c
여기서는 합쳐질 대상 배열들 모두에 대하여 꺽쇠괄호를 덧씌워야 한다는 것에 유의해야 합니다. 출력된 결과를 보면 다음과 같습니다.
C INT = Array[4, 5]
34 55 19 28
26 40 7 31
17 24 10 61
41 12 20 9
6 15 37 28
이와 같이 행 방향으로 더 커진 배열을 얻었음을 알 수 있습니다. 그렇다면 행 대신 열(Row) 방향으로 합치는 경우도 당연히 있을 것입니다. 그러면 a는 그대로 사용하고 여기에 열 방향으로 추가될 b라는 배열이 있어야 하므로, 이번에는 b를 다음과 같이 2x3의 구조를 갖는 배열로 정의해봅시다.
b = [[18, 29], [42, 34], [11, 27]]
HELP, b
PRINT, b
이 배열은 다음과 같은 모습입니다.
18 29
42 34
11 27
그러면 4x3 배열과 2x3 배열을 열 방향으로 합쳐서 6x3 배열로 만들어봅시다. 일단 이 과정을 도식적으로 보면 다음 그림과 같습니다.
실제 처리 과정은 다음과 같습니다.
c = [a, b]
HELP, c
PRINT, c
이와 같이 열 방향으로 크기가 더 커지는 효과를 얻으려면 합쳐질 대상 배열들 모두에 대하여 꺽쇠괄호를 추가하지 않고 그냥 적어주면 된다는 것만 유의하면 됩니다. 출력된 결과를 보면 다음과 같습니다.
C INT = Array[6, 3]
34 55 19 28 18 29
26 40 7 31 42 34
17 24 10 61 11 27
그리고 2차원 배열에 대하여 행 또는 열 방향으로 하나의 라인(Line)씩만 추가하고 싶은 경우가 있습니다. 먼저 행 방향의 라인 추가 예제를 도식적으로 보면 다음과 같습니다.
그러면 이 그림을 참조하여 일단 배열 a는 그대로 사용을 하고 b가 다음과 같이 그냥 1차원 배열로 정의되어있다고 합시다.
b = [25, 14, 40, 18]
이 때 배열 a에 배열 b를 행 방향으로 합쳐서 4x4의 구조를 갖는 c라는 배열을 얻기 위한 과정은 다음과 같습니다.
c = [[a], [b]]
HELP, c
PRINT, c
출력된 내용은 다음과 같습니다. 의도했던 결과를 얻었음을 확인할 수 있습니다.
34 55 19 28
26 40 7 31
17 24 10 61
25 14 40 18
이번에는 열 방향으로 라인 하나를 추가하는 예제를 봅시다. 먼저 이러한 예제를 도식적으로 보면 다음 그림과 같습니다.
이 그림을 참조하여 배열 a는 그대로 사용하고 b가 다음과 같이 그냥 1차원 배열로 정의되어있다고 합시다.
b = [32, 19, 7]
이 때 배열 a에 배열 b를 열 방향으로 합쳐서 5x3의 구조를 갖는 c라는 배열을 얻기 위한 과정은 다음과 같습니다.
c = [a, TRANSPOSE(b)]
HELP, c
PRINT, c
여기서는 합치는 과정에서 b에 대하여 TRANSPOSE 함수가 사용된 것에 유의해야 합니다. 이것은 원래 가로 방향의 1차원 배열이었던 b를 일시적으로 세로 방향의 1차원 배열로 변환하기 위한 것입니다. 그래야 열 방향으로 원활하게 합쳐지게 됩니다. 출력된 내용을 보면 다음과 같습니다. 의도했던 결과를 얻었음을 확인할 수 있습니다.
34 55 19 28 32
26 40 7 31 19
17 24 10 61 7
이와 같이 2차원 배열의 경우에는 추가될 차원이 행(Column) 또는 열(Row) 방향이냐에 따라서 문법이 서로 다르다는 점을 유의해야 합니다. 그렇다면 3차원 배열의 경우는 어떻게 해야 할까요? 모르긴 해도 아마 더 복잡한 문법이 등장할 것 같다는 느낌이 듭니다. 그러면 3차원 배열에 대한 내용은 다음 회차에서 이어가도록 하겠습니다.
'IDL > 배열 생성 및 처리' 카테고리의 다른 글
배열 내 값들에 대한 샘플링(Sampling) (4) | 2023.05.26 |
---|---|
배열 합치기(Array Concatenation) [2] (0) | 2023.04.18 |
INDGEN 함수 사용시 주의할 점 (0) | 2023.02.16 |
배열 처리 함수 소개 (SHIFT, REVERSE, ROTATE) [2] (0) | 2022.04.06 |
배열 처리 함수 소개 (SHIFT, REVERSE, ROTATE) [1] (0) | 2022.03.25 |