정리노트

[딥러닝] numpy 사용하기 본문

프로그래밍/머신러닝, 딥러닝

[딥러닝] numpy 사용하기

Rolen 2024. 10. 15. 00:18
import numpy as np
a = np.array([1, 2, 3]) # 기본 배열 생성
b = np.array([[1, 2, 3], [4 ,5, 6], [7, 8, 9]])	# 2차원 배열 생성
c = np.zeros((3, 4))	# 해당 크기의 배열을 만들고 값은 모두 0
d = np.ones((3, 4), dtype = np.int64)	# 해당 크기의 배열을 만들고 값은 정수 1로 채우기
e = np.eye(5)		# 인덱스 0,0 / 1,1 / 2,2 .. 대각선 1로 채우기
a = np.array([[0, 1, 2], [3, 4 ,5], [6, 7, 8]])

a.shape    	# 배열의 형상 호출 --> (3, 3)
a.dtype		# 배열 요소의 자료형 --> dtype('int64')
a.itemsize	# 배열 요소 한 개의 크기 --> 8 (단위 byte)
a.size		# 배열 요소의 개수 --> 9

  • 균일한 간격으로 배열 생성하기
np.arange(0, 10, 2) # (s, e, step) s부터 e-1까지 step만큼 증가하며 만들기
'''array([0, 2, 4, 6, 8])'''

np.linspace(1, 10, 3) # (s, e, n) s부터 e까지 n개로 나누어서 만들기
'''array([ 1. ,  5.5, 10. ])'''

arr = np.array([2, 3, 4, 5, 1])
arr.sort()  	# 정렬
arr
'''array([1, 2, 3, 4, 5])'''

  • 배열 합치기
x = np.array([[1, 2], [3, 4]])
y = np.array([[5, 6], [7, 8]])
z = np.array([[9, 10], [11, 12]])
np.concatenate((x, y, z), axis = 1) # 배열 합치기, axis = 1 : 1개의 배열로

'''array([[ 1,  2,  5,  6,  9, 10], [ 3,  4,  7,  8, 11, 12]])'''
       
np.vstack((x, y)) # 배열 행으로 쌓아서 합치기
'''
array([[1, 2],
       [3, 4],
       [5, 6],
       [7, 8]])'''

np.hstack((x, y)) # 배열 열로 늘려서 합치기
'''array([[1, 2, 5, 6], [3, 4, 7, 8]])'''

  • 배열의 형태 변경하기
a = np.arange(12) # 0부터 11까지 배열 만들기
# array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

a.shape	# (12,)
a.reshape(3, 4)	  # 3행 4열로 형상변경
'''array([[ 0,  1,  2,  3],
    	  [ 4,  5,  6,  7],
      	  [ 8,  9, 10, 11]])'''
          
a.reshape(6, -1)
# (-1, 2): 행은 데이터 갯수에 맞추어 자동 조정, 열 2열
# (2, -1): 행 2개, 열은 데이터 갯수에 맞추어 자동 조정
'''array([[ 0,  1],
          [ 2,  3],
          [ 4,  5],
          [ 6,  7],
          [ 8,  9],
          [10, 11]])'''

array = np.arange(30).reshape(-1, 10) # 생성 -> 행/열 조정
array
'''array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
          [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
          [20, 21, 22, 23, 24, 25, 26, 27, 28, 29]])'''

  • 배열을 여러 작은 배열로 분할하기
'''array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
          [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
          [20, 21, 22, 23, 24, 25, 26, 27, 28, 29]])'''
          
arr1, arr2 = np.split(array, [3], axis = 1)
# axis = 1 : 세로로 자르기 / axis = 0 : 가로로 자르기
arr1
'''array([[ 0,  1,  2],
          [10, 11, 12],
          [20, 21, 22]])'''
arr2
'''array([[ 3,  4,  5,  6,  7,  8,  9],
          [13, 14, 15, 16, 17, 18, 19],
          [23, 24, 25, 26, 27, 28, 29]])'''

  • 배열에 새로운 축 추가하기
a = np.array([1, 2, 3, 4, 5, 6])
a.shape	# (6,)

a1 = a[np.newaxis, :] # 행에 축 추가
a1
'''array([[1, 2, 3, 4, 5, 6]])'''
# a1.shape --> (1, 6)

a2 = a[:, np.newaxis] # 열에 축 추가
a2
'''array([[1],
          [2],
          [3],
          [4],
          [5],
          [6]])'''
# a2.shape --> (6, 1)

b = np.expand_dims(a, axis = 1) # 행에 a를 축으로 추가, 열은 1열
b
'''array([[1],
          [2],
          [3],
          [4],
          [5],
          [6]])'''

  • 인덱스와 슬라이싱
nums = np.array([22, 21, 34, 36, 44])
nums[1:3] # 인덱스 1부터 3-1 까지
nums[:2]  # 0부터 2-1까지
y = nums > 30 # 배열에서 30보다 큰 수? 참 거짓
y
'''array([False, False,  True,  True,  True])'''

nums [nums > 30]	# 다른점 : y = [nums > 30] 는 참 거짓 표현됨
'''array([34, 36, 44])'''

nums [(nums > 30) & (nums < 38)] # 30보다 크고 38보다 작은 수
'''array([34, 36])'''

# 2차원도 크게 다르지 않다.
  • 얕은 복사 / 깊은 복사
nums = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
nums2 = a[0, :]
nums2
'''array([1, 2, 3, 4])'''

num2[0] = 99 # nums의 값을 num2로 가져오고 num2의 값을 수정
num # num2에서 바꾸었지만 원본 nums의 값도 변경됨 --> 얕은 복사 (메모리적 효율로 인한 사용)
'''array([[99,  2,  3,  4],
          [ 5,  6,  7,  8],
          [ 9, 10, 11, 12]])'''

deepNums = nums.copy() # .copy() --> 깊은 복사
deepNums
'''array([[99,  2,  3,  4],
          [ 5,  6,  7,  8],
          [ 9, 10, 11, 12]])'''
          
deepNums[0] = 1
deepNums
'''array([[ 1,  1,  1,  1],
          [ 5,  6,  7,  8],
          [ 9, 10, 11, 12]])'''
          
nums # copy()로 진행한 b2의 값을 변경해도 원본값 유지
'''array([[99,  2,  3,  4],
          [ 5,  6,  7,  8],
          [ 9, 10, 11, 12]])'''

  • 기본 배열 연산
arr1 = np.array([[1, 2], [3, 4], [5, 6]])
arr2 = np.array([[1, 1], [1, 1], [1, 1]])
result = arr1 + arr2  # 행, 열에 맞추어 연산
result
'''array([[2, 3],
          [4, 5],
          [6, 7]])'''
          
a = np.array([0, 1, 2, 3])
a**2	# 각 요소마다 제곱 진행
'''array([0, 1, 4, 9])'''

a < 2
'''array([ True,  True, False, False])'''

# 간단한 배열 요소 계산 (numpy의 강점)
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

a.sum()  # 배열 전체 합  // 45
a.min()  # 배열 전체 최솟값
a.max()	 # 배열 전체 최댓값
a.mean() # 배열 전체 평균

scores = np.array([[100, 90, 80], [80, 80, 80], [100, 70, 80]])
scores.mean(axis = 0) # 열 방향으로 평균
'''array([93.33333333, 80.        , 80.        ])'''

scores.mean(axis = 1) # 행 방향으로 평균
'''array([90.        , 80.        , 83.33333333])'''

  • 브로드캐스팅
    예시) 3개의 요소가 있는 배열에 *2 를 했을때 자동으로 3개의 요소에 맞추어 확장 후 곱하기 진행
arr = np.array([1, 2, 3]) # 각 열마다 *2
result = arr * 2
result
'''array([2, 4, 6])'''

arr1 = np.array([[1, 2], [3, 4], [5, 6]])
arr2 = np.array([[2, 2], [2, 2], [2, 2]])
result = arr1 * arr2  # 각 행, 열에 맞추어 준다.
result
'''array([[ 2,  4], [ 6,  8], [10, 12]])'''

  • 난수 배열 생성
np.random.seed(100)
np.random.rand(3) # 3개의 난수값을 가진 배열 생성
'''array([0.54369217, 0.20049061, 0.67016086, 0.55811222, 0.23237832])'''

np.random.rand(2, 3)  # 2행 3열 형태의 난수값 배열 생성
'''array([[0.35974477, 0.1591823 , 0.43295804],
          [0.27936218, 0.96103763, 0.09813216]])'''

10* np.random.rand(3) +10  # 10~20 사이의 난수값을 가진 배열 생성
'''array([14.06995552, 10.08376446, 15.6805893])'''

np.random.randint(1, 5, size = 5)  # 1, 5-1 의 정수 5개를 가진 배열 생성
'''array([2, 4, 1, 4, 2])'''

np.random.randn(5) # 표준정규분포를 따르는 난수값 5개를 가진 배열 생성
'''array([-0.68437098,  0.25641114, -1.38950895,  2.07439733,  0.49033626])'''

np.random.randn(5, 4)   # 표준정규분포를 따르는 난수값으로 5행 4열을 가진 배열 생성
'''array([[ 0.56119834, -0.9454057 ,  1.0991844 , -0.27310347],
          [-0.14407117,  1.5804042 , -2.14841076,  0.52957547],
          [-0.48970206,  1.15681569,  1.66130224,  1.21409356],
          [-0.41595992,  0.05126083,  0.06524321,  1.88598587],
          [ 0.04630159, -0.1830548 , -1.23954822, -0.64197766]])'''

  • 중복 제거
arr = np.array([1, 1, 2, 2, 2, 3, 3, 4])
np.unique(arr)
'''array([1, 2, 3, 4])'''

  • 고유값
# 고유값 인덱스 호출
arr = np.array([1, 1, 2, 2, 2, 3, 3, 4])
arr = np.unique(arr, return_index = True)
arr
'''(array([1, 2, 3, 4]), array([0, 2, 5, 7]))'''

# 고유값 카운트
arr = np.array([1, 1, 2, 2, 2, 3, 3, 4])
arr = np.unique(arr, return_counts = True)
arr
'''(array([1, 2, 3, 4]), array([2, 3, 2, 1]))'''

  • 전치 행렬 계산
arr = np.array([[1, 2], [3, 4], [5, 6]])
print(arr.T)  # .T : 전치 행렬 계산
'''[[1 3 5]
    [2 4 6]]'''

  • 다차원 -> 1차원 배열 만들기
'''flatten() : 다차원 배열을 1차원으로 만들기  --> 메모리 복사 발생
reshape(-1) : 다차원 배열을 1차원으로 만들기  --> 메모리 복사 미발생 
ravel() : 다차원 배열을 1차원으로 만들기      --> 메모리 복사 미발생
'''

a = np.array([[1, 2], [3, 4], [5, 6]])
flat_arr = a.flatten()
flat_arr[0] = 99
print(a)
print(flat_arr, "\n")
'''[[1 2]
    [3 4]
    [5 6]]
[99  2  3  4  5  6]'''

reshape_arr = a.reshape(-1)
reshape_arr[0] = 99
print(a)
print(reshape_arr, "\n")
'''[[99  2]
    [ 3  4]
    [ 5  6]]
[99  2  3  4  5  6]'''

ravel_arr = a.ravel()
ravel_arr[1] = 66
print(a)
print(ravel_arr)
'''[[99 66]
    [ 3  4]
    [ 5  6]]
[99 66  3  4  5  6]'''
728x90