2. 데이터 핸들링을 위한 라이브러리 Numpy
01. Numpy란
02. Numpy와 파이썬 List 차이
03. 배열의 기초
04. 배열의 속성
05. 실습
06. Indexing & Slicing
01. Numpy란
Numpy : 파이썬에서 과학계산과 데이터 분석에 필요한 기본 패키지로 대규모의 다차원 배열을 다룰 수 있게 도와준다.
(Numerical Python의 약자로, 수치적 파이썬을 의미.)
즉, 여러 차원의 큰 배열을 다룰때 유용한 패키지로, 데이터 분석을 위해서 pandas와 함께 필수적으로 숙지해야 하는 패키지이다.
* 데이터 분석 및 머신러닝에 자주 쓰이는 파이썬 라이브러리로는
Numpy, Pandas, Matplotlib, Tensorflow, Pytorch, Scipy, Keras 등이 있다.
그렇다면 Numpy는 왜 사용할까?
1.
우리가 향후 다룰 데이터의 대부분은 숫자 배열로 볼 수 있다.
예를들어, 하나의 이미지는 하나의 픽셀을 명암에 따라 숫자로 나타내서 배열로 나타낼 수 있다.
또한 소리도 배열 형태의 데이터로 나타낼 수 있다.
그렇기에 우리는 대규모의 배열을 다룰 수 있는 라이브러리가 필요!
2.
파이썬 리스트에 비해 처리 속도가 빨라서 성능이 우수하고,
선형대수, 통계 관련 여러 함수가 내장되어 있다.
Numpy의 특징.
- 대규모의 다차원 배열(ndarray)을 처리하는데 필요한 여러 유용한 기능을 제공
- 같은 자료형의 데이터를 담을 수 있는 포괄적인 배열
- Numpy는 반복문 없이 대용량의 배열을 처리 할 수 있다.
- 파이썬 리스트에 비해 빠른 연산을 지원하여 메모리를 효율적으로 사용할 수 있다.
02. Numpy와 파이썬 List의 차이
Numpy와 List는 데이터의 타입, 데이터를 생성하는 법, 데이터의 형태가 다릅니다.
코드를 통해 확인해봅시다.
파이썬에서 0~4가 담긴 리스트 배열 생성 및 출력 형태 확인
list_arr = list(range(5))
print(list_arr) # [0,1,2,3,4] => 콤마로 구분
print(type(list_arr)) # <class 'list'>
Numpy로 array 생성 및 출력 형태 확인
import numpy as np
np_arr = np.array(range(5))
print(np_arr) # [0 1 2 3 4 ] => 공백으로 구분
print(type(np_arr)) # <class 'numpy.ndarray>
정리하면
파이썬은 [0,1,2,3,4]와 같이 콤마로 구분하지만
넘파이는 [0 1 2 3 4]와 같이 공백으로 구분.
파이썬의 데이터 타입은 list지만
넘파이의 데이터 타입은 numpy.ndarray.
03. Numpy 배열 ndarray의 기초
파이썬의 리스트는 하나의 리스트 안에 다양한 형태의 데이터 타입을 저장할 수 있지만,
Numpy의 array는 같은 데이터 타입만 저장할 수 있다.
Numpy 배열의 데이터 타입 : dtype
import numpy as np
arr = np.array([0, 1, 2, 3, 4], dtype=float)
#array를 실수형으로 지정해줬기에 1. 과 같이 실수형으로 나타난다
print(arr) #[0. 1. 2. 3. 4.]
#arr의 타입을 출력
print(arr.dtype) # 'float 64'
#arr를 int형으로 출력
print(arr.astype(int)) # [0 1 2 3 4]
ndarray 생성하기
import numpy as np
#np.array()
list1 = [0, 1, 2, 3]
arr1 = np.array(list1)
#np.array()
arr2 = np.array([0, 1, 2, 3])
#np.arange() : range()함수와 유사하지만 리스트 대신 ndarray를 반환
arr3 = np.a.arange(10)
#np.ones() : 원소가 모두 1인 배열 생성
np.ones((4,5))
#np.zero() : 원소가 모두 0인 배열 생성
np.zeros((2,3,4,5))
dtype의 종류
04. 배열의 속성
ndarray의 차원 관련 속성 : ndim & shape
ndim은 차원을 출력하고
shape는 배열의 모양을 출력한다.
list = [0, 1, 2, 3]
#파이썬의 list를 활용해서 numpy의 array를 생성할 수 있다.
arr = np.array(list) #np.array(range(4))와 같은 표현.
#[0,1,2,3]의 ndim과 shape
print(arr.ndim) #1
print(arr.shape) #(4,)
list = [[0,1,2], [3,4,5]]
#2차원 배열
arr = np.array(list)
print(arr.ndim) #2
print(arr.shape) #(2,3)
ndarray의 크기 속성과 shape 조절
아래와 같은 arr을 만들고 shape와 size, len을 출력해 봅시다.
arr = np.array([0,1,2,3,4,5])
print("arr.shape : {}".format(arr.shape)) # arr.shape : (6,)
print("배열 요소의 수 : {}".format(arr.size)) # 배열 요소의 수 : 6
print("배열의 길이 : {}".format(len(arr))) # 배열의 길이 : 6
arr의 shape를 3,2로 바꾸고, shape, size, len을 다시 한 번 확인해봅시다.
arr.shape = 3,2
print("arr.shape : {}".format(arr.shape)) #arr.shape : (3,2)
print("배열 요소의 수 : {}".format(arr.size)) # 배열 요소의 수 : 6
print("배열의 길이 : {}".format(len(arr))) #배열의 길이 : 3
#shape, size와 len의 사용방식 다른것 주의!
[0 1 2 3 4 5]였던 array가 아래와 같이 변하게 됩니다.
[[0 1]
[2 3]
[4 5]]
05. 실습
*type과 dtype이 다른 것 주의
import numpy as np
print("1차원 array")
array = np.array(range(10))
print(array)
# 1. type()을 이용하여 array의 자료형을 출력해보세요.
print(type(array)) #<class 'numpy.ndarray'>
# 2. ndim을 이용하여 array의 차원을 출력해보세요.
print(array.ndim) #1
# 3. shape을 이용하여 array의 모양을 출력해보세요.
print(array.shape) #(10,)
# 4. size를 이용하여 array의 크기를 출력해보세요.
print(array.size) #10
# 5. dtype을 이용하여 array의 dtype(data type)을 출력해보세요.
print(array.dtype) #int64
# 6. array의 5번째 요소를 출력해보세요. (array[5])
print(array[5]) #5
# 7. array의 3번째 요소부터 5번째 요소까지 출력해보세요. (array[3:6])
print(array[3:6]) #[3 4 5]
import numpy as np
print("2차원 array")
matrix = np.array(range(1,16)) #1부터 15까지 들어있는 (3,5)짜리 배열을 만듭니다.
matrix.shape = 3,5
print(matrix)
# 1. type을 이용하여 matrix의 자료형을 출력해보세요.
print(type(matrix))
# 2. ndim을 이용하여 matrix의 차원을 출력해보세요.
print(matrix.ndim)
# 3. shape을 이용하여 matrix의 모양을 출력해보세요.
print(matrix.shape)
# 4. size를 이용하여 matrix의 크기를 출력해보세요.
print(matrix.size)
# 5. dtype을 이용하여 matrix의 dtype(data type)을 출력해보세요.
print(matrix.dtype)
# 6. astype을 이용하여 matrix의 dtype을 str로 변경하여 출력해보세요.
print(matrix.astype('str'))
# 7. matrix의 (2,3) 인덱스의 요소를 출력해보세요.
print(matrix[2,3])
# 8. matrix의 행은 인덱스 0부터 인덱스 1까지 (0:2), 열은 인덱스 1부터 인덱스 3까지 (1:4) 출력해보세요.
print(matrix[0:2, 1:4])
06. Indexing & Slicing
인덱싱 : 데이터를 찾아내는 것.
슬라이싱 : 데이터를 잘라내는 것.
인덱싱
x = np.arange(7)
print(x) # [0 1 2 3 4 5 6]
print(x[3]) #3
print(x[7]) # IndexError : index 7 is out of bounds
x[0] = 10
print(x) #[10 1 2 3 4 5 6]
x = np.arrange(1, 13, 1)
x.shape = 3, 4
print(x)
#[[1 2 3 4 ]
[5 6 7 8]
[9 10 11 12]]
print(x[2,3]) #12
슬라이싱
x = np.arange(7)
print(x) #[0 1 2 3 4 5 6]
print(x[1:4]) #[ 1 2 3 ]
print(x[1:]) #[1 2 3 4 5 6]
print(x[:4]) # [0 1 2 3]
print(x[::2]) #[0 2 4 6]
x = np.arange(1, 13, 1)
x.shape = 3,4 #3행 4열로 배열의 shape 변경
print(x)
print(x[1:2, :2:3]) #1:2 => 1행출력, :2:3 => 1열까지 출력하는데 3씩 증가하며 출력(여기서는 1열만 출력 된다.)
print(x[1:, :2])
07. 실습
인덱싱 : 데이터를 찾아내는 것.
슬라이싱 : 데이터를 잘라내는 것.