[데이터 처리] NumPy

Olivu·2024년 1월 9일
0

Data

목록 보기
2/5
post-thumbnail

NumPy 공식 가이드
https://numpy.org/doc/stable/reference/index.html


Array

  • 여러 element들을 묶음으로 저장하는 데이터 타입
  • list와 달리 array는 차원을 갖는 데이터
    세로축(행 row) = axis 0
    가로축(열 column) = axis 1
    깊이(depth) = axis 2

  1. Numpy 라이브러리 설치
pip install numpy==1.23.5

  1. import 라이브러리
    numpy library는 np라는 별칭으로 import한다.
import numpy as np

Array 생성

1차원 Array 생성

my_list = [1,2,3,4]
arr_1 = np.array(my_list)

print(arr_1)	# output is [1,2,3,4]

type(arr_1)		# output is numpy.ndarray

2차원 Array 생성

arr_2 = np.array([
	[1,2,3],
    [2,3,4],
])

print(arr_2)	# output is [[1 2 3]
							 [2 3 4]]

type(arr_2)		# output is numpy.ndarray

3차원 Array 생성

arr_3 = np.array([
    [[1,2,3], [3,4,5], [10,20,30]],
    [[4,5,6], [7,9,8], [15,54,78]],
    [[1,2,3], [3,4,5], [5121,999,989.0]]
])

print(arr_3)	# output is 
 					# [[[1.000e+00 2.000e+00 3.000e+00]
  					#  [3.000e+00 4.000e+00 5.000e+00]
  					#  [1.000e+01 2.000e+01 3.000e+01]]

 					# [[4.000e+00 5.000e+00 6.000e+00]
  					#  [7.000e+00 9.000e+00 8.000e+00]
  					#  [1.500e+01 5.400e+01 7.800e+01]]

 					# [[1.000e+00 2.000e+00 3.000e+00]
  					#  [3.000e+00 4.000e+00 5.000e+00]
  					#  [5.121e+03 9.990e+02 9.890e+02]]]

1로 채워진 Array 생성

np.ones((shape), type)

# 행3, 열4인 integer type array 생성하기
arr_4 = np.ones((3,4), 'int)

print(arr_4)

0으로 채워진 Array 생성

np.zeros((shape), type)

# 3 X 5 X 5의 float타입의 array 생성하기
arr_5 = np.zeros((3,5,5), 'float')

print(arr_5)

0이상 1미만의 실수값으로 채워진 Array 생성

np.random.random((shape))

# 0이상 1미만의 실수값으로 채운 4 X 5 array 생성
arr_6 = np.random.random((4,5))

print(arr_6)

Array 정보 확인하기

array변수명.shape

print(arr_1.shape)
print(arr_2.shape)
print(arr_3.shape)

Array dtype 확인

array변수명.dtype

  • Array가 담고있는 element의 data type 확인한다.
  • Element 중 가장 범위가 넓은 data type으로 전체 data type을 변경하여 저장한다.
  • data type 범위: 문자열 str > 실수형 float > 정수형 int

예제

print(arr_1.dtype)
print(arr_3.dtype)

Array의 dtype 변경

array변수명.reshape(shape)

  • shape 입력값에 tuple 형태로 shape을 넣어준다.
  • 이때, 2차원 기준, 행&열 모두 입력할 수도 있고, 행/열 하나만 입력하고 입력하지 않은 항목에 -1을 넣으면 자동으로 계산해서 넣어준다.

예제1) 행,열을 명시적으로 입력하여 shape 변경

arr = np.array([
    [1,2,3,4,5,6],
    [10,20,30,40,50,60],
    [100,50,35,48,64,70],
    [10,20,30,40,50,60]
])

arr.shape 	# output is (4,6)

arr_2 = arr.reshape(3,8)

print(arr_2)	# output is 
					# [[  1   2   3   4   5   6  10  20]
 					#  [ 30  40  50  60 100  50  35  48]
 					#  [ 64  70  10  20  30  40  50  60]]
 
print(arr_2.shape)	# output is (3,8)

예제2) 행,열 중 하나의 값만 넣어서 shape 변경

arr_3 = arr_2.reshape(2,-1)

print(arr_3.shape)	# output is (2,12)
arr_4 = arr_2.reshape(-1, 6)

print(arr_4.shape) 	# output is (4,6)

Array 인덱싱

array변수명[row_number, column_number]

  • 배열[행,열] 형태로 지정해 그 위치의 요소를 조회한다.
  • 인덱스는 0부터 시작한다.
  • list 인덱싱처럼 마이너스 인덱싱도 가능하다.

예제

arr = np.array([[ 7, 34, 94, 24, 60],
                [56, 34, 87, 59, 66],
                [14, 44, 19, 51, 78],
                [90, 22, 43, 91, 62],
                [84, 78, 22,  8, 62]])

array row 인덱싱

arr[0]		# output is array([ 7, 34, 94, 24, 60])

arr[3]		# output is array([90, 22, 43, 91, 62])

array row & column 인덱싱

arr[3,3]	# output is 91

arr[3][3]	# output is 91

arr[-2][-2]	# output is 91

Array 슬라이싱

  • array변수명[row, column]을 잘라서 리턴한다.
  • list 슬라이싱처럼 마지막 row,column은 제외하고 슬라이싱 된다.
  • 콜론(:)을 기준으로 시작index, 끝index를 지정하며, 시작index와 끝index는 생략이 가능하다.
  • 콜론(:)의 앞부분을 비워놓으면 처음 row,column부터 가져오라는 의미
  • 콜론(:)의 뒷부분을 비워놓으면 마지막 row,column까지 가져오라는 의미
arr= np.array([[98, 73, 15, 74,  5],
              [16, 26, 75, 79, 30],
              [39, 65, 54, 72, 82],
              [70, 63, 79, 24, 86],
              [91, 13, 28, 87, 52]])

array row 슬라이싱

arr[0:3]
# output is array([[98, 73, 15, 74,  5],
       			#  [16, 26, 75, 79, 30],
       			#  [39, 65, 54, 72, 82]])
                  
arr[2:-1]
# output is array([[39, 65, 54, 72, 82],
       			#  [70, 63, 79, 24, 86]])

array column 슬라이싱

arr[:, 2:-1]
# output is array([[15, 74],
       			#  [75, 79],
       			#  [54, 72],
      			#  [79, 24],
      			#  [28, 87]])

조건에 따라 Array 인덱싱

array변수명[조건]
조건에 따라 인덱싱하면 무조건 1차원 array 형태로 반환된다.

arr= np.array([[98, 73, 15, 74,  5],
              [16, 26, 75, 79, 30],
              [39, 65, 54, 72, 82],
              [70, 63, 79, 24, 86],
              [91, 13, 28, 87, 52]])
              
arr[ arr < 20 ]
# output is array([15,  5, 16, 13])

조건에 따라 Array의 값 수정

np.where(조건, 조건이 True일때 값, 조건이 False일때 값)

arr= np.array([[98, 73, 15, 74,  5],
              [16, 26, 75, 79, 30],
              [39, 65, 54, 72, 82],
              [70, 63, 79, 24, 86],
              [91, 13, 28, 87, 52]])
              
arr_2 = np.where(arr > 70, 0, arr)

print(arr_2)
# output is array([[ 0,  0, 15,  0,  5],
       			#   [16, 26,  0,  0, 30],
                #   [39, 65, 54,  0,  0],
                #   [70, 63,  0, 24,  0],
                #   [ 0, 13, 28,  0, 52]])
arr_3 = np.where(arr > 70, arr, 1)

print(arr_3)
# output is array([[98, 73,  1, 74,  1],
       			#   [ 1,  1, 75, 79,  1],
       			#   [ 1,  1,  1, 72, 82],
      			#   [ 1,  1, 79,  1, 86],
      			#   [91,  1,  1, 87,  1]])
arr_4 = np.where(arr > 70, arr, -arr)

print(arr_4)
# output is array([[ 98,  73, -15,  74,  -5],
       			#   [-16, -26,  75,  79, -30],
     			#   [-39, -65, -54,  72,  82],
      			#   [-70, -63,  79, -24,  86],
         		#   [ 91, -13, -28,  87, -52]])

Array 연산

Array 사칙 연산

array끼리 shape이 동일해야 한다.

x = np.array([[98, 73, 15, 74,  5],
              [16, 26, 75, 79, 30],
              [39, 65, 54, 72, 82],
              [70, 63, 79, 24, 86],
              [91, 13, 28, 87, 52]])
              
y = np.array([[12, 57, 61, 13, 29],
              [ 9, 96,  5, 30, 21],
              [ 9, 90,  5, 18, 45],
              [75, 11, 79, 33, 31],
              [ 5, 24,  1, 12, 93]])
  • 덧셈: x + y

  • 뺄셈: x - y

  • 곱셈: x * y

  • 나눗셈: x / y


Array Dot product 연산

np.dot(array변수명1, array변수명2)
dot product 연산은 vector의 외적을 의미한다.

arr_1 = np.random.randint(1, 10, (2, 4))

arr_2 = np.random.randint(1, 10, (4, 2))

print(np.dot(arr_1, arr_2))

Array Transpose 연산

array변수명.T

  • 행과 열을 뒤집는 연산
  • 딥러닝에서 주로 weight와 input data의 연산을 위해 사용한다.
arr = np.array([[1, 2, 3,],
                [4, 5, 6]])
                
print(arr.T) 	# output is array([[1, 4],
       					 		#  [2, 5],
       					 		#  [3, 6]])

Array Shuffle

np.random.shuffle(array변수명)

  • array를 뒤섞는 연산
  • 행 기준으로 섞어주며, 행 안의 요소들은 바뀌지 않는다.
arr = np.array([[1, 2, 3],
				[4, 5, 6],
           	    [7, 8, 9]])

np.random.shuffle(arr)

print(arr)		# output is [[4 5 6]
 						#	 [7 8 9]
						#	 [1 2 3]]

Array Sampling

  • array의 element 중 원하는 개수만큼 랜덤으로 추출하는 기능
  • array는 반드시 1차원이어야 한다.
  • 샘플링 종류에는 복원추출과 비복원추출이 있다.

1) 복원추출

np.random.choice(변수명, 추출개수)

추출된 요소를 다시 array에 넣고 추출한다. 즉, 중복 추출 허용

arr = np.array([[98, 73, 15, 74,  5],
                [16, 26, 75, 79, 30],
                [91, 13, 28, 87, 52]])
        
# 1차원으로 변환
arr = arr.faltten()
        
np.random.choice(arr,3)

2) 비복원추출

np.random.choice(변수명, 추출개수, replace = False)

추출된 요소는 다시 array에 넣지 않는다. 즉, 중복 추출 불가

arr = np.array([[98, 73, 15, 74,  5],
                [16, 26, 75, 79, 30],
                [91, 13, 28, 87, 52]])
        
# 1차원으로 변환
arr = arr.flatten()
        
np.random.choice(arr,3, replace = False) 
profile
천천히 꾸준히 기록

0개의 댓글