1.NumPy란?
NumPy는 Python이 수학적 연산을 보다 효과적으로 할 수 있게 만드는 기본 패키지입니다. 파이썬의 라이브러리로서 다차원 배열 객체(ndarray), 행렬, 벡터, 형상 조작, 이산 푸리에 변환, 기본 선형 대수, 기본 통계 연산, 난수, 벡터 산술 연산, 랜덤 시뮬레이션 등 다양한 기능을 탑재하고 있습니다.
NumPy의 자료형으로는 float, complex(복소수), int, bool, string, object(객체)등이 있습니다.
NumPy 패키지의 중심은 다차원배열객체(ndarray, N-dimensional array)입니다. 이는 같은 데이터형의 n차원 배열을 캡슐화하고 컴파일된 코드를 실행하며 수학적 퍼포먼스를 실현합니다.
과학과 공학의 거의 모든분야에서 NumPy 배열을 사용하고 있습니다. 따라서 오늘날 과학적이고 수학적인 Python 기반 소프트웨어의 대부분을 효율적으로 사용하기 위해서는 NumPy 배열의 사용법을 알고 있어야 합니다.
2. 다차원배열객체(ndarray)란?
우선 컴퓨터 과학에서 배열(array)이란 인덱스와 그 인덱스에 대응하는 데이터들로 이루어진 자료 구조를 나타냅니다. 음이 아닌 정수, 튜플, 다른 배열 등으로 인덱싱 될 수 있습니다. 일반적으로 배열에는 같은 종류의 데이터들이 순차적으로 저장되며, 값의 인덱스가 곧 값이 저장되어 있는 상대적 위치가 됩니다.
대부분의 프로그래밍 언어에서 사용할 수 있는 가장 기초적인 자료 구조로, 기본적인 용도 외에도 다른 복잡한 자료 구조들을 표현하거나 행렬, 벡터 등을 표현하는 용도로 사용됩니다. 배열의 첫 번째 요소의 메모리 주소를 첫 번째 주소, 또는 기본 주소라고 합니다.
다차원배열객체(ndarray)란 임의의 차원을 갖는 배열을 의미합니다. 선형대수에서 1-D 또는 1차원 배열, 2-D 또는 2차원 배열 등을 들어 본 적이 있을 것입니다. NumPy의 ndarray 클래스는 행렬과 벡터 모두를 나타낼 수 있는데, 벡터는 1차원 배열 (행 벡터와 열 벡터의 차이는 없습니다)을, 행렬은 2차원 배열을 말합니다. 3차원 이상의 배열의 경우는 일반적으로 텐서(tensor)라고 합니다.
* 배열(arrary)과 리스트(list)의 차이점
NumPy는 배열을 작성하여 내부 수치 데이터를 조작하기 위한 매우 빠르고 효율적인 방법을 제공합니다. Python의 컨테이너 포스팅에서 리스트(list)는 엄밀하게 말하면 배열이 아니라고 했는데 그 이유는 한 리스트 내에 다른 데이터형을 포함할 수 있기 때문입니다. 반대로 NumPy 배열은 배열 내의 모든 데이터의 종류가 동일해야 합니다. 즉 동일한 type의 값들을 갖습니다. 배열이 고르지 못할 경우 배열에 대해 실행되는 수학적 연산이 매우 비효율적이기 때문입니다.
또한 NumPy 배열은 메모리 소비량이 적어서 사용하기 편리하고 리스트보다 더 빠르고 콤팩트 합니다. 따라서 코드를 한층 더 최적화할 수 있습니다.
3. NumPy 설치
NumPy는 command 창 (명령 프롬프트)에서 쉽게 설치 가능합니다.
파이썬을 실행한 다음에
pip install numpy
를 명령하면 설치 창이 뜨고, 간단히 설치를 완료할 수 있습니다.
응답이 없거나 아나콘다 배포판으로 파이썬을 설치하셨다면 이미 numpy가 설치되어 있을 수도 있습니다.
numpy는 또한 Google colab의 코드 셀에서도 실행 가능합니다.
용량 등으로 인해 설치하지 못하는 분이 계신다면, Google Colab을 사용하는 것을 추천드립니다.
4. Numpy 호출 및 배열 생성하기
numpy는 외부의 라이브러리이기 때문에 numpy를 사용하려면 numpy를 불러야 합니다.
이때는 다음과 같은 명령어를 사용합니다.
import numpy as np
: numpy를 np라는 이름으로 가져 와라라는 명령어입니다.
numpy는 보통 [ numpy.메서드 ] 로 메서드와 함께 사용되는데, 입력하기 간편하게 보통 np로 이름을 지어줍니다.
파이썬 명령 프롬프트에서나 구글 코랩에서나 명령 방식은 같습니다.
numpy를 호출했으면 여러 가지 numpy 기능을 사용할 수 있습니다.
위에서 언급한 것처럼 numpy 패키지의 중심은 배열이므로, 배열을 생성해야 합니다.
다음은 배열을 생성하는 함수들입니다.
- np.array( list ) : 가장 기본적이고 단순한 배열 작성 방법으로, 함수에 리스트를 넘겨주면 됩니다. 원하는 경우에는 리스트에 데이터 유형을 지정할 수도 있습니다.
- np.zeros( int or tuple ) : 0이 들어있는 배열을 간단하게 생성해주는 명령어입니다.
- np.ones( int or tuple ) : 1이 들어있는 배열을 간단하게 생성해주는 명령어입니다.
- np.empty( int or tuple ) : 메모리의 상태에 따라 랜덤으로 배열을 만듭니다. 나중에 요소를 수정하거나 더 채워 넣을 수 있습니다. 처리속도를 높이기 위해 사용하는 기법입니다.
- np.arange( scalar ) : 파이썬에서 사용하는 range() 함수의 결과가 요소로 들어갑니다. range( ) 에서 사용 가능한 기법들 ( 첫 번째 숫자 지정, 두 번째 숫자 지정, step size 지정) 역시 사용 가능합니다.
- np.linspace( scalar, num=n ) : 간격을 지정하여 선형으로 배치된 n개의 값을 갖는 배열을 만들 수 있습니다.
- eye( n ) : n차 단위 행렬(n차 정사각 행렬에서 대각선의 원소가 모두1이고, 다른 원소는 모두 0인 행렬을 의미합니다. 단위행렬 E를 임의의 행렬 A와 곱하면 행렬 A가 얻어집니다.) 을 생성하는 함수입니다. 참고로 단위행렬이란 n차 정사각행렬에서 대각선의 원소가 모두 1이고, 다른 원소는 모두 0인 행렬을 의미합니다. 단위행렬 E를 임의의 행렬 A와 곱하면 행렬 A가 얻어집니다.
# 예시
(i) np.array( list )
-> 함수에 리스트를 넘겨줍니다. 2차원 배열을 생성하기 위해선 대괄호 [ ]를 바깥에 하나 더 감싸야합니다.
생성한 배열의 type이 'numpy.ndarray'인 것을 볼 수 있습니다.
(ii) np.zeros( int or tuple )
(iii) np.ones( int or tuple )
-> zeros와 ones입니다. 소괄호 () 안에 int형이 들어갔으면 1차원 배열(벡터)이, tuple형이 들어갔으면 2차원 배열(행렬)이 출력되는 것을 볼 수 있습니다.
(iv) np.empty( int or tuple )
empty함수 역시 소괄호 () 안에 int형이 들어갔으면 1차원배열(벡터)가, tuple형이 들어갔으면 2차원배열(행렬)이 출력됩니다. 배열은 랜덤입니다. 나중에 요소를 수정하거나 더 채워 넣을 수 있습니다.
(v) np.arange()
-> Python의 range() 함수와 유사하게 작동하는 것을 볼 수 있습니다.
(vi) np.linspace()
-> 역시 Python의 linspace() 함수와 유사하게 작동합니다. 최소 2개의 arguments를 갖는다는 것을 알 수 있습니다.
(vii) np.eye(n)
-> n차 단위행렬이 만들어진 것을 볼 수 있습니다.
5. 배열의 정보알기
아래 속성들로 우리가 만든 배열의 차원, 모양, 크기, 자료형을 알 수 있습니다.
- array_name.ndim : dimention, 즉 배열의 차원 또는 배열 축의 숫자를 나타냅니다. 이 함수를 통해 배열의 차원을 의미하는 rank의 값을 구할 수 있습니다.
- array_name.shape : 배열의 각 차원에 따라 저장되어있는 요소의 수를 정수(튜플)로 표시합니다. 1차원 배열(벡터)이라면 (크기, )로, 2차원배열(행렬)이면 (행, 열)로 출력됩니다. 2행 3열의 2차원 배열의 경우, 배열의 shape는 (2, 3)입니다.
- array_name.size : 배열의 요소 수를 나타냅니다. shape 각 원소의 곱이 그 값이 될 것입니다. 예를들어 2행 3열의 2차원 배열의 경우, 배열의 shape는 (2, 3), 배열의 size 는 ( 2 x 3 = 6 ) 이 될 것입니다.
- array_name.dtype : 배열에 저장된 데이터형을 알려주는 객체입니다.
- narray_name.dtype.name : 배열에 저장된 데이터형의 이름을 알려주는 객체입니다.
6. 배열 reshape하기
배열을 reshape한다는 것은 사전적 의미 그대로 배열의 모양[구조]을 고치거나 개장[개조]하는 것입니다. reshape를 사용하면 데이터 변경 없이 배열에 새로운 형상이 주어집니다. 여기서 주의할 점은 reshape 방법을 사용하는 경우, 새로 생성하려는 배열에는 원래 배열과 같은 수의 요소가 필요하다는 것입니다. 예를들어 12개의 요소로 구성되어 있는 배열을 reshape하려는 경우, 새로운 배열에도 총 12개의 요소가 포함되어 있는지 확인해야 합니다.
reshape는
[ array_name.reshape( row, column ) ]
로 사용합니다.
reshape 하려는 요소의 수를 다르게 하면 에러가 발생합니다.