ML & DL/데이터 분석

[python] Numpy 기초

uni2237 2021. 9. 28.
728x90
728x90

Numpy

👉 Python에서 대규모 다차원 배열 다룰 수 있게 도와주는 라이브러리

 

장점

- 반복문 없이 배열 처리 가능

- list 보다 빠른 연산 , 메모리 효율적 사용

 

list vs numpy 배열 생성

- list

arr=list(range(3))
print(arr) # [0,1,2] -> 콤마(,)로 구분됨
print(type(arr)) # <class 'list'>

- numpy

import numpy as np
arr=np.array(range(3)) # np.arange(3)도 같은 결과
print(arr) # [0 1 2] -> 공백으로 구분
print(type(arr)) # <class 'numpy.ndarray'>

 

 

배열의 '데이터의 타입' dtype

(list와 달리 같은 데이터 타입만 저장 가능)

arr=np.array([0,1,2], dtype=float)
print(arr) # [0. 1. 2.]
print(arr.dtype) # 'float64'
print(arr.astype(int)) # [0 1 2]

 

 

ndarray 속성 -  ndim(차원) & shape(모양)

arr_1d=np.array([0, 1, 2]) # 1차원 배열
arr_2d=np.array([[0,1,2],[1,2,3]]) # 2차원 배열

print(arr_1d.ndim) # 1 -> 차원 수 
print(arr_1d.shape) # (3,) -> 배열의 모양

print(arr_2d.ndim) # 2 
print(arr_1d.shape) # (2, 3)
'''
1. 배열 모양 : arr.shpe
2. 배열 요소의 개수 : arr.size
3. 배열 길이 : len(arr)
'''

arr=np.array([0,1,2,3,4,5])

print( arr.shape ) # (6,) 
print( arr.size ) # 6
print( len(arr) ) # 6

arr.shape=3,2  # shape 조절됨 -> [[0 1] [2 3] [4 5]]

print( arr.shape ) # (3,2) 
print( arr.size ) # 6
print( len(arr) ) # 3

 

인덱싱 & 슬라이싱

- 인덱싱 (인덱스로 값 찾아냄)

# 1차원
x=np.arange(5) # [0 1 2 3 4 5]
print(x[3]) # 3

x[0]=10 # 인덱싱 사용해서 값 변경
print(x) # [10 1 2 3 4 5]

# 2차원
x=np.arange(1, 13 ,1) # [ 1  2  3  4  5  6  7  8  9 10 11 12]
x.shape=3,4
print(x)
'''
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
'''
print(x[2,3]) # 12

 

- 슬라이싱 (인덱스 값으로 배열의 일부분 가져옴)

arr[a:b] -> a부터 b-1까지 인덱스에 해당하는 부분

arr[a:b, c:d] -> arr에서 a부터 b-1까지 / c부터 d-1까지에 해당하는 부분

# 1차원
x=np.arange(7) # [0 1 2 3 4 5 6]
print(x[1:4]) # [1 2 3] -> 1부터 3까지
print(x[1:]) # [1 2 3 4 5 6] -> 1부터 끝까지
print(x[:4]) # [0 1 2 3] -> 처음부터 3까지
print(x[::2]) # [0 2 4 6] -> 처음부터 끝까지, 2칸씩


# 2차원
x=np.arange(1, 13 ,1) # [ 1  2  3  4  5  6  7  8  9 10 11 12]
x.shape=3,4
print(x)
'''
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
'''
print(x[1:2,2:3]) # [[7]] -> 행: 1~1까지, 열:2~2까지
print(x[1:,:2]) # 행:1~끝까지, 열:처음부터~1까지
'''
[[ 5  6]
 [ 9 10]]
'''

 

- Boolean indexing (배열의 각 요소를 Boolean mask를 사용해서 지정)

boolean mask? : True,False로 구성된 mask array

x=np.array(7) # [0 1 2 3 4 5 6]

print(x<3) # [ True  True  True False False False False]
print(x[x<3]) # [0 1 2] -> Boolean mask의 True에 해당하는 index만 조회

 

- Fancy indexing (배열의 각 요소 선택을 직접 index 배열 전달해서 지정)

x=np.arange(7) # [0 1 2 3 4 5 6]
print(x[[1,3,5]])# [1 3 5]

 

- indexing과 slicing 조합해서 사용가능

x=np.arange(1,13,1).reshape(3,4)
print(x)
'''
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
'''
print(x[1:2,2]) # [7]
print(x[[0,2],2]) # [3 11] -> '행: 0,2 인것' 중 '열: 2 인것'
print(x[[0,2], :2]) # -> '행: 0,2 인것' 중 '열: 처음부터 2까지 인것'
''' 
[[ 1  2]
 [ 9 10]]
'''

전체 실습

import numpy as np

#1부터 15까지 들어있는 (3,5)짜리 배열 생성
matrix = np.array(range(1,16))
matrix.shape = 3,5

''' matrix
[[ 1  2  3  4  5]
 [ 6  7  8  9 10]
 [11 12 13 14 15]]
'''

# 1. matrix 자료형
print(type(matrix)) # <class 'numpy.ndarray'>

# 2. 차원
print(matrix.ndim) # 3

# 3. 모양
print(matrix.shape) # (3,5)

# 4. 크기
print(matrix.size) # 15

# 5. matrix의 dtype(data type)
print(matrix.dtype) # int64

# 6. matrix의 dtype을 str로 변경
print(matrix.astype('str'))
'''
[['1' '2' '3' '4' '5']
 ['6' '7' '8' '9' '10']
 ['11' '12' '13' '14' '15']]
'''

# 7. matrix의 (2,3) 인덱스의 요소
print(matrix[2:3])  # [[11 12 13 14 15]]

# 8. matrix의 행은 인덱스 0부터 인덱스 1까지, 열은 인덱스 1부터 인덱스 3까지
print(matrix[0:2,1:4])
'''
[[2 3 4]
 [7 8 9]]
'''
728x90
728x90

댓글