컴퓨터 영상 처리/Numpy

1. Numpy 배열(Array)

Zoo_10th 2024. 2. 28.

1. Numpy 

수치 해석을 위해 사용되고 Numeric + Python의 앞글자를 따서 Numpy라고 이름이 지어졌으며, 파이썬으로 통계 및 수치 해석을 가능하게 해주는 파이썬 패키지이다. 

파이썬의 대표적인 자료형인 리스트는 수학 연산을 하기 매우 불편하고 느리다. 반면 Numpy의 자료구조인 배열(array)은 수학 연산이 매우 편리하며, 속도도 빠르고 메모리 사용량도 적다. 이러한 이유로 Numpy는 파이썬으로 데이터 분석이나 복잡한 수학 연산이 필요한 경우 필수적으로 사용된다.

Numpy는 외부 패키지이므로 사용 시 반드시 import 과정이 필요하며, 대부분 as(alias)를 사용하여 np로 사용한다.

예시) import numpy as np

 

1-2. Numpy 장점

  • POWERFUL N-DIMENSIONAL ARRAYS : 빠르고 다재다능한 NumPy 벡터화, 인덱싱 및 브로드캐스팅 개념은 오늘날 어레이 컴퓨팅의 사실상의 표준이다.
  • NUMERICAL COMPUTING TOOLS NumPy는 포괄적인 수학 함수, 난수 생성기, 선형 대수 루틴, 푸리에 변환 등을 제공한다.
  • INTEROPERABLE NumPy는 광범위한 하드웨어 및 컴퓨팅 플랫폼을 지원하며 분산, GPU 및 희소 배열 라이브러리와 잘 작동한다.
  • PERFORMANT NumPy의 핵심은 잘 최적화된 C 코드다. 컴파일된 코드의 속도로 Python의 유연성을 나타낸다.
  • EASY TO USE NumPy의 높은 수준의 구문은 모든 배경 또는 경험 수준의 프로그래머가 액세스할 수 있고 생산적이다.
  • OPEN SOURCE 자유로운 BSD 라이센스 에 따라 배포되는 NumPy는 응답성이 뛰어나며 다양한 커뮤니티 에 의해 GitHub에서 공개적으로 개발 및 유지 관리 된다.

1-3. List 와 Array의 차이

Numpy의 array는 수치 연산이 필요한 경우나 대량의 데이터 처리에 유용하며, List는 다양한 타입의 데이터를 유연하게 다루고자 할 때 사용된다.

- 데이터 타입: List는 다양한 타입의 요소를 저장할 수 있지만, Numpy의 array는 동일한 타입의 요소만을 가진다. 이는 Numpy array가 데이터의 유형을 명시하고 효율적인 메모리 사용을 가능하게 한다.

- 성능: Numpy의 array는 C로 구현된 내부 반복문과 최적화된 연산을 통해 빠르고 효율적인 계산을 수행할 수 있다. 따라서, 대량의 수치 데이터 처리나 수학 연산에 있어서 List보다 성능이 우수하다.

- 기능: List는 다양한 메서드와 연산자를 제공하여 데이터를 조작할 수 있다. Numpy의 array는 벡터화 연산과 다양한 수학 함수, 선형 대수 연산 등의 기능을 제공한다.

 

2. Array(배열)

"Array(배열)"은 Numpy의 자료 구조를 의미한다.

array에는 다양한 데이터 타입(dtype)이 저장될 수 있으며, list와 마찬가지로 각 요소에 접근이 가능하도록 index를 가지고 있다. 또한 array는 차원을 가지고 있으며, 각 차원에 따라 배열의 크기가 결정된다.

 

파이썬에서 List와 Numpy의 Array는 구조적으로 차이가 있다. List는 여러 요소들을 포장지처럼 하나의 리스트 안에 담는 개념이며, 2차원 List를 만들 경우에는 리스트 안에 또 다른 리스트가 포함된다.

예를 들어, [[1, 2, 3], [4, 5, 6], [7, 8, 9]]와 같은 형태다.

반면에 Numpy의 Array는 행렬(matrix)이라고 생각할 수 있다. Array는 축(axis) 개념을 갖고 있으며, 각 축에 따라 배열의 크기가 결정된다. 2차원 배열은 행(row)과 열(column)을 가지는 행렬로 생각할 수 있다.

예를 들어, array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])와 같은 형태다.

 

이러한 차이점 때문에 List는 단순히 요소에 접근하기 위한 순차적인 방식으로 사용되는 반면, Array는 좌표를 통해 요소에 접근할 수 있는 구조를 갖고 있습니다. Array는 행과 열의 인덱스를 사용하여 요소에 접근할 수 있습니다.

 

데이터 분석이나 수학적 연산과 같은 작업을 위해서는 Numpy의 Array가 더 효율적이고 유용하다.

 

2-1. ndarray(N차원 배열)

Numpy의 ndarray는 "N차원 배열(N-dimensional array)"의 줄임말로, 차원 수에 관계없이 모든 배열을 표현할 수 있다.

1차원 배열은 벡터(Vector), 2차원 배열은 행렬(Matrix), 그리고 3차원 이상의 배열은 텐서(Tensor)라고 부른다. 모든 차원의 배열을 Numpy에서는 ndarray 클래스로 정의한다.

 

ndarray는 Numpy의 핵심적인 자료구조로서, 다차원 배열을 표현하고 다양한 연산을 수행할 수 있도록 제공된다.  ndarray는 동일한 데이터 타입의 요소를 갖는 다차원 배열이며, 배열의 크기(shape)와 데이터 타입(dtype)을 가지고 있다.

 

2-1-1. ndarray의 특성

ndarray는 차원 수와 배열 모양을 나타내는 shape을 가지고 있다. 이를 통해 배열의 크기가 결정된다.

ndarray의 형태
데이터 유형을 나타내는 계층구조

 

3. Array Operation(배열의 활용)

3-1. 배열생성

 - Array 생성

기본적인 배열을 생성하는 방법은 np.array(리스트)를 통해 생성할 수 있다. 또한 데이터의 타입을 지정하는 것도 가능하다. np.array(리스트, 데이터타입)을 하게 되면 모든 요소의 데이터 타입을 지정할 수 있다. 만약 더 세부적인 타입을 지정하려면 np.array(리스트, dtype=데이터타입_byte)로 지정할 수 있다.

 

- 다양한 형태의 Array 생성

 * zeros

np.zeros는 0으로 가득찬 배열을 생성한다. 생성할 배열의 수가 1개고 차원이 1인 vector를 생성할경우엔 정수만 입력하고 차원의 수를 늘리고 싶다면 앞에 정수를 입력하면된다. 입력된 Tuple은 Shape과 같은 형태다.

 

 * ones

np.ones는 1로 가득찬 배열을 생성한다. 생성할 배열의 수가 1개고 차원이 1인 vector를 생성할 경우엔 정수만 입력하고 차원의 수를 늘리고 싶다면 앞에 정수를 입력하면된다. 입력된 Tuple은 Shape과 같은 형태다.

 

 * arange

1차원의 벡터를 생성할때 연속되는 숫자로 생성하는 함수로 arange가 있다. 시작할 숫자와 마지막 숫자를 생략할 경우 0부터 지정된 숫자까지 연속된 정수를 생성한다. 인자가 여러개여도 Tuple을 사용하지 않는다.

 

 *linspace

arange 함수와 비슷하지만 마지막 인자는 간격이 아닌 시작과 끝 사이의 몇개의 수를 갖을 것인가를 나타낸다. linspace함수는 그래프를 그릴때 유용하게 사용할 수 있다. linespace는 인자가 최소 2개가 필요하며, 인자가 2개일 경우 처음 시작부터 마지막 숫자까지 동일한 간격의 숫자를 벡터 형태로 나타낸다.

3-2. 배열 인덱싱

Numpy의 배열은 Python의 List나 Tuple과 같이 인덱싱과 슬라이싱이 가능하다.

 

3-2-1. 1차원 Vector 인덱싱과 슬라이싱

파이썬의 List와 Tuple을 인덱싱한 것과 같이 array[인덱스]를 사용하여 지정할 수 있다. 슬라이싱도 마찬가지로 array[시작위치:마지막위치]와 같이 사용할 수 있다.

 

3-2-2. 2차원 이상의 배열의 인덱싱과 슬라이싱

Python의 List와 tuple의 인덱싱과 슬라이싱 방식은 첫 번째 자료형을 선택하고 그 안에서 다시 자료형을 선택하는 방식으로 인덱싱과 슬라이싱이 된다. 물론 배열 역시 이러한 방식의 인덱싱과 슬라이싱이 가능하지만, Python에서 반복문을 사용해야하는 인덱싱과슬라이싱을 Array에서는 쉽게 구현할 수 있다.

 

Python의 List를 사용하면 for문을 사용해야 하지만, Numpy의 배열은 단순한 쉼표( , )만으로 그 기능을 구현할 수 있다.

 

2차원 이상의 배열을 인덱싱하고 슬라이싱하는 방법은 Python의 List와 tuple과 조금 다른데, 2차원 이상의 array에서는 대괄호([ ])를 하나만 사용하고 쉼표( , )로 구분한다.

예시)array[axis0(행),axis1(열)]

Python에서의 중첩 List 슬라이싱

 

Numpy 배열의 슬라이싱

 

3-2-3. 조건에 맞는 데이터 추출(Boolean Indexing)

파이썬에서는 조건에 맞는 데이터를 추출할 때 if문을 사용하여 해당 조건에 맞는 데이터를 추출한다. Numpy의 배열에서는 조건문을 별도로 생성하지 않고, 대괄호([ ]) 안에 조건을 입력하면 간단하게 조건에 맞는 데이터만 추출할 수 있다.

예시) array[조건]

 

3-3. 배열 다루기

3-3-1 reshape, resize

reshape 함수는 배열의 모양을 변경하여 새로운 배열을 반환하고, resize함수는 배열의 모양을 변경하면서 원본 배열 자체를 수정한다.

 

np.reshape 함수는 배열의 모양(shape)을 변경하는 함수입니다. 예를 들어, 0부터 9까지의 숫자로 된 1차원 배열이 있을 때, 이를 2x5의 행렬로 변환하고 싶을 때 reshape 함수를 사용할 수 있다. reshape 함수는 변경된 값을 반환하기 때문에 원본 배열 자체를 변경하지 않는다.

 

reshape 함수는 모든 축(axis)의 곱과 원래 배열의 요소 수가 같아야한다. 즉, 변경된 배열의 모든 요소 수가 원래 배열과 동일해야 한다.

축을 지정할때 하나의 축을 -1로 지정할 경우 해당 값을 자동으로 인식하게 된다. 모든 축을 지정하지 않고 -1만 입력할 경우 해당 축을 1차원 벡터로 변경한다.

 

resize 함수는 배열의 모양을 변경하고 원본 배열 자체를 수정한다. resize함수는 빈공간을 0으로 채우며, 모든 축의 크기를 지정하거나 하나의 축을 -1로 지정하여 다른 축을 기준으로 자동 값을 설정할 수 있다.

 

3-3-2. T, transpose,swapaxes

Numpy의 T함수는 전치행렬(Transpose)을 생성하는 함수다. 전치행렬은 행과 열을 바꿔놓은 행렬로, 예를 들어 3x4 행렬을 전치하면 4x3 행렬이 된다. T함수는 정해진 규칙에 따라 행과 열을 바꾸어 전치행렬을 만들어 준다. 예를들어 2X3X4행렬의 전치행렬은 4X3X2가 된다. 

 

transpose 함수는 축(axis)을 직접 설정하여 배열의 모양을 변경하는 함수입니다. 예를 들어, (axis0, axis1, axis2)를 (axis1, axis0, axis2)로 바꾸기 위해서는 array.transpose(1,0,2)와 같이 사용할 수 있다. transpose 함수의 인자로는 축의 순서를 나타내는 값을 받는다. 

swapaxes 함수는 두개의 축을 서로 바꾸는 함수이다. 즉, 인자로 받은 두개의 축을 서로 교환한다. 예를 들어, array.swapaxex(0,1)은 첫번째 축과 두번째 축을 바꿔준다.

 

이세가지 함수는 모두 원본 배열을 직접 변경하지 않고 변환된 값을 반환한다. 즉, 배열 자체를 수정하지 않고 새로운 배열을 생성한다.

 

reshape 함수는 배열의 모양을 변경하여 새로운 배열을 반환하고, transpose 함수는 축의 순서를 변경하여 배열의 모양을 변화하며, swapaxes 함수는 두개의 축을 서로 교환한다.

 

arr.T전치행렬

arr.transpose(axis0 ,axis1, …) ⇒ 위치를 변경할 axes

arr.swapaxes(axis0 ,axis1) ⇒ 위치를 변경할 axes 2개

 

3-3-3. concatenate

concatenate 함수는 배열을 합치는 함수로, 파이썬에서 +기호로 두개의 리스트를 합칠수 있었지만 Numpy에서는 + 기호가 연산을 수행하므로 배열을 합치기 위해서는 concatenate 함수를 사용한다. concatenate 함수는 합쳐야 할 배열들을 튜플 형태로 입력받고, 어느 축(axis)에 합칠지를 지정한다. 만약 축을 선택하지 않으면 기본적으로 axis=0으로 합쳐진다. 또한, axis=None으로 설정하면 1차원 벡터로 합쳐진다.

np.concatenate((배열1,배열2),axis=0or1)

728x90

'컴퓨터 영상 처리 > Numpy' 카테고리의 다른 글

2.Numpy 연산(Matrix Operations)  (2) 2024.02.28

댓글