NumPy 소개
Numpy(보통 "넘파이"라고 발음)는 수치 해석용 Python 패키지이다. 다차원의 행렬 자료구조인 ndarray를 지원하여 벡터와 행렬을 사용하는 선형대수 계산에 주로 사용된다. C로 구현된 CPython에서만 사용할 수 있다. NumPy의 행렬 연산은 C로 구현된 내부 반복문을 사용하기 때문에 Python 반복문에 비해 속도가 빠르다. 행렬 인덱싱(array indexing)을 사용한 질의(Query)기능을 이용하여 짧고 간단한 코드로 복잡한 수식을 계산할 수 있다.
- 수치해석용 Python 라이브러리
- CPython에서만 사용 가능
- ndarray 다차원 행렬 자료 구조 제공
- 내부 반복문 사용으로 빠른 행렬 연산 가능
- 행렬 인덱싱(array indexing) 기능 제공.
ndarray 클래스
NumPy의 핵심은 ndarray라고 하는 클래스 이다. ndarray 클래스는 다차원 행렬 자료 구조를 지원한다.
>>> import numpy as np
>>> a = np.array([0,1,2,3,4,5,6,7,8,9])
>>> type(a)
<class 'numpy.ndarray'>
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
만들어진 ndarray 객체의 표현식(representation)을 보면 바깥쪽에 array()란 것이 붙어 있을 뿐 리스트와 동일한 구조처럼 보인다. 하지만 ndarray 객체와 list 객체는 많은 차이가 있다.
-
Python 리스트
-
여러가지 타입의 원소
-
linked List 구현
-
메모리 용량이 크고 속도가 느림
-
벡터화 연산 불가
-
-
NumPy ndarray
-
동일 타입의 원소
-
contiguous memory layout
-
메모리 최적화, 계산 속도 향상
-
벡터화 연산 가능
-
1. 우선, ndarray클래스는 C언어의 행렬처럼 연속적인 메모리 배치를 가지기 때문에 모든 원소가 같은 자료형이어야한다. 이러한 제약을 가지는 대신 내부의 원소에 대한 접근과 반목문 실행이 빨라진다.
2. 두번째로, ndarray클래스는 벡터화 연산(vectorized operation)을 지원한다.
예를 들어 원소 모두를 제곱하기 위해서는 반복문을 이용해 원소를 각각 제곱할 필요 없이 객체 자체를 제곱하는 것만으로도 원하는 결과를 얻을 수 있다.
>>> a = np.array([0,1,2,3,4,5,6,7,8,9])
>>> a2 = a**2
>>> a2
array([ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81], dtype=int32)
벡터화 연산이 반복문을 이용한 연산보다 훨씬 빠르다.
다차원 행렬의 생성
ndarray는 N-dimensional Array의 약자이다. 단순 리스트와 유사한 1차원 행렬 이외에도 2차원, 3차원 행렬등의 다차원 행렬 자료 구조를 지원한다.
np.array(리스트 구조) 함수 를 사용하면 다차원 행렬을 생성할 수 있다.
>>> a = np.array([1,2,3])
>>> a
array([1, 2, 3])
>>> b = np.array([[1,2,3],[4,5,6]]) # 2 X 3 array
>>> b
array([[1, 2, 3],
[4, 5, 6]])
>>> c = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]]) # 2 X 2 X 3 array
>>> c
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
행렬의 차원 및 크기는 ndim속성과 shape속성으로 알 수 있다.
>>> a.ndim
1
>>> a.shape
(3,)
>>> b.ndim
2
>>> b.shape
(2, 3)
>>> c.ndim
3
>>> c.shape
(2, 2, 3)
다차원 행렬의 인덱싱(indexing)과 슬라이싱(slicing).
### 정수 인덱싱 ###
>>> b
array([[1, 2, 3],
[4, 5, 6]])
>>> b[0,0] # 1행, 1열
1
>>> b[0,1] # 1행, 2열
2
>>> c
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
>>> c[0,0,:] # 첫번째 tesnor, 첫번째 row, column 전체
array([1, 2, 3])
>>> c[0,0,1:] # 첫번째 tesnor, 첫번째 row, 두번째 column부터 마지막까지.
array([2, 3])
### Boolean 인덱싱 ###
>>> a = np.array([0,1,2,3,4,5,6,7,8,9])
>>> idx = np.array([True,False,True,False,True,False,True,False,True,False])
>>> a[idx]
array([0, 2, 4, 6, 8])
array([0, 2, 4, 6, 8])
>>> a = np.array([[0,1,2,3,4],[5,6,7,8,9]])
>>> a[ a % 2 == 0 ]
array([0, 2, 4, 6, 8])
행렬 인덱싱
-
불리안(Boolean) 방식 행렬 인덱싱
-
True인 원소만 선택
-
인덱스의 크기가 행렬의 크기와 같아야 한다.
-
-
위치 지정 방식 행렬 인덱싱
-
지정된 위치의 원소만 선택
-
인덱스의 크기가 행렬의 크기와 달라도 된다
-
그밖에 numpy reshape을 이용하면 행렬 구조를 바꿀 수 있다.
2020/03/13 - [Python] - [ Python 3 ] Numpy reshape 함수란. (추가, 다른 형태의 자료를 np.array 활용하여 reshape 이용 가능)
출처
https://datascienceschool.net/view-notebook/416d733c3a734565b69fd0c8dc959edb/