[Python] Jupiter Notebook에서 numpy
쥬피터 노트북에서 파이썬의 numpy의 사용
numpy
numpy란 , C 언어로 구현된 파이썬 라이브러리로 고성능의 수치 계산을 위해 제장 되었다. Numerical Python의 줄임말로 numpy는 벡터 및 행렬 연산에 있어서 매우 편리한 기능들을 제공한다.
- 행렬 / 선형대수 / 통계 패키지
- 머신러닝의 이론적 백그라운드는 선형대수와 통계로 이루어져 있다
- 사이킷런 같은 머신러닝 패키지가 넘파이 기반으로 되어 있다
데이터 분석시 사용되는 라이브러리인 pandas와 matplotlib의 기반으로 사용되기도 한다.
머신러닝 알고리즘이나 사이파이와 같은 과학, 통계 지원용 패키지를 직접 만드는 개발이 아니라면 넘파이를 상세하기 알 필요는 없다지만, 넘파이를 이해하는 것이 파이썬 기반의 데이타분석과 머신러닝에 중요하다
넘파이가 데이타 핸들링에 효율적으로 쉽고 편하고 할 수 없다. 그러나 데이타 핸들링에 주로 사용하는 판다스도 많은 부분이 넘파이를 기반으로 만들어져 있다.
ndarray
- 넘파이 기반 데이타 타입
- np.array()
이해를 돕기위한 코딩 예제
numpy 형 만들기
import numpy as np # numpy를 사용하기위해서 필요하다
#리스트 2개를 선언한다.
list_1=[1,2,3]
list_2=[9,8,7]
#리스트 2개를 모두 넘파이 array로 대입한다.
arr =np.array([list_1,list_2])
print(arr) # 리스트 2개가 arr에 저장되어있는것을 볼 수 있다.
[[1 2 3]
[9 8 7]] <br/> <br/> ### 해당 array의 모양을 알려주는 요소 ```python arr.shape # 몇행 몇 열인지를 알려주는 것 ```
(2, 3)
array의 요소를 지정
#두번째 행 두번째 열의 요소를 100으로 지정
arr[1][1]=100
arr
array([[ 1, 2, 3],
[ 9, 100, 7]])
도움말 부르기
?arr # 도움말 부르기
numpy array 여러 요소
arr1=np.array([1,2,3]) # 이렇게 바로 선언하는것도 가능하다.
arr2=np.array([[1,2,3]])
print(arr1.shape) # (3,)
print(arr2.shape)
print(arr1.ndim,"차원")
print(arr2.ndim,"차원")
(3,) #3개의 요소를 가지고 있는 튜플 이라는뜻 1차원에서는 이런식으로 표현
(1, 3) #2차원부터 1행 3열이라고 표시
1 차원
2 차원
numpy array의 자료형
print(arr.dtype)
int32
numpy array 값의 data type 을 변경
arr2=arr.astype(np.float64) # 실수형 사용할 때 뒤에 0붙는것을 생략하고 .만 씀
arr2
array([[ 1., 2., 3.],
[ 9., 100., 7.]])
numpy array의 자료형
list_3=[100,40,99,'python']
arr3=np.array(list_3)
print(type(arr3)) # 리스트의 자료형은 numpy.ndarray이다.
print(arr3.dtype) #안에 담긴 숫자는 int32이다.
# < u32라는 형이나옴
<class 'numpy.ndarray'>
<U11
# [결과] <U11 : Unicode 문자열
nparray를 편리하게 생성
- arange() : 범위를 이용한 배열 만들기
- zeros() : 0으로 채우는 배열 만들기
- ones() : 1로 채우는 배열 만들기
a= np.arange(10)
a
b=np.arange(1,11)
b
c=np.arange(1,11,3)
c
array([ 1, 4, 7, 10])
a2=np.zeros((5,5),dtype='int32') # 0으로 된 배열을 생성
a2
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])
a3=np.ones((4,4),dtype='int32') #1로된 배열을 생성
a3
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])
ndarray의 차원과 크기를 변경 : reshape()
arr=np.arange(10) # 0부터 9까지 값을 넣음
print(arr.shape)
print(arr)
(10,)
[0 1 2 3 4 5 6 7 8 9]
arr2=arr.reshape(2,5) # 2차원배열 2행 5열로 변경
arr2
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
arr2=arr.reshape(3,3) # 리스트의 값과 정하는 행렬의 수가 맞아야 한다.
arr2
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-38-3dc1b6036ad3> in <module>
----> 1 arr2=arr.reshape(3,3)
2 arr2
ValueError: cannot reshape array of size 10 into shape (3,3)
인덱싱: 특정 데이타 추출 예제
#------------------------------------------ (1) 단일값 출력
import numpy as np
arr = np.arange(1, 11)
print(arr)
## 세번째 요소 추출 ( 0부터 인덱스)
arr[3]
## 뒤에서 세번째 요소 추출 ( 뒤에서 인덱스는 -1부터)
arr[-3]
[ 1 2 3 4 5 6 7 8 9 10]
8
## 1부터 9까지 nparray를 만들고 3행 3열 2차원 구조로 변경한후
## 두번째 행의 세번째 열의 값 추출
arr=np.arange(1,10)
arr2=arr.reshape(3,3)
print(arr2)
arr2[1][2]
[[1 2 3]
[4 5 6]
[7 8 9]]
6
#------------------------------------------ (2) 슬라이싱 (:)
arr = np.arange(1, 10)
arr=arr.reshape(3,3) # 3행 3열로 변환
## 2차원 배열 생성
"""
1 2 3
4 5 6
7 8 9
"""
## 행렬에서 1, 2, 4, 5 추출
print(arr[:2,:2]) # 0부터 1까지행의, 0부터 1까지 열의 값을 가져옴
## 행렬에서 4, 5, 6, 7, 8, 9 추출
print(arr[1:3,0:]) #1행부터 2행까지 0부터 끝까지 값을 가져옴
## 행렬에서 2, 3, 5, 6 추출
print(arr[:2,1:3])
## 행렬에서 1, 4 추출
print(arr[:2,:1])
## 행렬에서 전체 요소 추출
print(arr1[:3,:3])
값을 추출할 때
# 2차원 ndarray에서 뒤의 오는 인덱스가 없으면 1차원으로 반환
# 3차원 ndarray에서 뒤의 오는 인덱스가 없으면 2차원으로 반환
불린 인덱싱
#------------------------------------------ (3) 블린인덱싱
# 조건 필터링과 검색을 같이 하기에 자주 사용
arr = np.arange(1, 10)
ndarr = arr.reshape(3,3)
print(ndarr)
# 5보다 큰 요소들 추출
print(ndarr>5)
#이렇게 하면
#[False False False False False True True True True]
#가 나오게 된다.
#따라서 ndarr[] 안에 이 조건식을 사용하면 ,
print(ndarr[ndarr>5])
[6 7 8 9] #이렇게 원하는 값을 가져올 수 있다.
# 8값 요소를 88로 변경
ndarr[2][1]=88