1.  넘파이란 ?

🥑  NumPy : 배열 데이터를 효과적으로 다루고, 과학 연산을 쉽고 빠르게 할 수 있게 만든 패키지
🥑  파이썬의 기본 데이터 형식과 내장 함수를 이용하는 것보다 다차원 배열 데이터를 효과적으로 처리
🥑  NumPy는 파이썬의 내장 모듈이 아니라서 별도로 설치

import numpy as np

 

 

    📁 NumPy 홈페이지 : https://numpy.org/

 

NumPy -

Use the interactive shell to try NumPy in the browser

numpy.org


 

1) 배열 생성 

👾  배열 (Array) 이란?  순서가 있는 같은 종류의 데이터가 저장된 집합
👾  NumPy를 이용해 배열을 처리하기 위해서는 우선 NumPy로 배열을 생성해야 함

①  시퀀스 데이터로부터 배열 생성하기  'np. array()'

    - 시퀀스 데이터 seq_data를 인자로 받아 NumPy의 배열 객체 array object를 생성

# 정수 리스트로 배열 생성
data1 = [0, 1, 2, 3, 4, 5]
print(data1)  # [0, 1, 2, 3, 4, 5]
a1 = np.array(data1)
print(a1)  # [0 1 2 3 4 5]
print(a1.dtype)  # int64

# 정수와 실수가 혼합된 경우
data2 = [0.1, 5, 4, 12, 0.5]
a2 = np.array(data2)
print(a2)  # [ 0.1  5.   4.  12.   0.5]
print(a2.dtype)  # float64. 정수와 실수가 혼합돼 있을 때 모두 실수로 변환.

# 숫자와 문자가 있는 경우
data3 = [0.1, 5, 4, 12, 'test']
a3 = np.array(data3)
print(a3)  # ['0.1' '5' '4' '12' 'test']
print(a3.dtype)  # <U32 -> 길이가 32인 유니코드 문자열

# array()에 직접 리스트를 넣어서 배열 객체도 생성 가능
a3 = np.array([0.5, 2, 0.01, 8])
print(a3)  # [0.5  2.   0.01 8.  ]

# 다차원 배열의 생성 예
a4 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(a4)
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]

    


 

②  범위를 지정해 배열 생성  'np.arange()'
 

    ·  arange()를 이용해 Numpy 배열을 생성, 파이썬의 range()와 사용방법이 비슷 

# 기본 형식
arr_obj = np.arrange([start,] stop[, step])

 

     📌  start부터 시작해서 stop 전까지 step만큼 계속 더해 NumPy 배열을 생성
            ➡️ start가 0인 경우에는 생략가능
            ➡️ step이 1인 경우에는 생략가능

a1 = np.arange(0, 10, 2)
print(a1)  # [0 2 4 6 8]

a2 = np.arange(1, 10)
print(a2)  # [1 2 3 4 5 6 7 8 9]

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

 


 

③  2차원 배열로 변경 '.reshape(m, n)'

 

    ·  arrange()를 이용해 생성한 1차원 배열에 reshape(m, n)을 추가하면 m 행  n 열의 2차원 배열(행렬)로 변경
    ·  주의할 점은 arange()로 생성되는 배열의 원소 개수와 reshape(m, n)의 m * n 의 개수와 같아야

a4 = np.arange(12).reshape(4, 3)
print(a4)
# [[ 0  1  2]
#  [ 3  4  5]
#  [ 6  7  8]
#  [ 9 10 11]]

 


 

④  배열의 형태  '.shape'

# NumPy 배열의 형태를 알기 위헤서는 'ndarray.shape'를 실행
print(a4.shape)  # (4, 3)

# 1차원 배열의 경우 '(n, )'처럼 표시
print(a1.shape)  # (5,)

 


 

범위의 시작과 끝, 데이터 개수 지정하여 배열 생성  'np.linspace()'

# 기본 형식
arr_obj = np.linspace(start, stop[, num])
# linspace()는 start부터 stop까지 num개의 배열을 같은 간격으로 생성. 
# num을 지정하지 않으면 50이 기본값.

 

a1 = np.linspace(1, 10, 10)
print(a1)  # [ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10.]

a2 = np.linspace(1, 10, 4)
print(a2)  # [ 1.  4.  7. 10.]

# 0부터 파이까지 동일한 간격으로 20개를 나눈 배열 생성
a3 = np.linspace(0, np.pi, 20)
print(a3)
# [0.         0.16534698 0.33069396 0.49604095 0.66138793 0.82673491
#  0.99208189 1.15742887 1.32277585 1.48812284 1.65346982 1.8188168
#  1.98416378 2.14951076 2.31485774 2.48020473 2.64555171 2.81089869
#  2.97624567 3.14159265]

 


2)  특별한 형태의 배열 생성

👾  모든 원소가 0 혹은 1인 다차원 배열을 만들기 위해서는 'zeros()'와 'ones()'를 이용

a1 = np.zeros(10)
print(a1)  # [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

# 3 * 4의 2차원 배열을 생성
a2 = np.zeros((3, 4))
print(a2)
# [[0. 0. 0. 0.]
#  [0. 0. 0. 0.]
#  [0. 0. 0. 0.]]

a3 = np.ones(5)
print(a3)  # [1. 1. 1. 1. 1.]

 


 

3)  배열의 데이터 타입 변환

👾  배열은 숫자뿐만 아니라 문자열도 원소로 가질 수 있음

# 문자열이 원소인 배열 생성 예
a1 = np.array(['1.5', '0.62', '2', '3.14', '3.141592'])
print(a1)  # ['1.5' '0.62' '2' '3.14' '3.141592']
print(a1.dtype)  # <U8. 데이터 형식이 유니코드이며 문자의 수는 최대 8개라는 의미

 


 

4)  NumPy 데이터의 형식

b 불. bool
기호가 있는 정수. (signed) integer
u 기호가 없는 정수. unsigned integer
f 실수. floating-point
c 복소수. complex-floating point
M 날짜. datetime
O 파이썬 객체. (Python) objects
S or a 바이트 문자열. (byte) string
U 유니코드. Unicode


👾  배열이 문자열(숫자 표시)로 돼 있다면 연산을 위해서는 문자열을 숫자(정수나 실수)로 변환해야 함
👾  형 변환은 astype()로 가능

num_arr = str_arr.astype(dtype)
# 실수가 입력된 문자열을 원소로 갖는 배열을 실수 타입으로 변환하는 예.
str_a1 = np.array(['1.567', '0.123', '5.123', '9', '8'])
num_a1 = str_a1.astype(float)
print(num_a1)  # [1.567 0.123 5.123 9.    8.   ]
print(str_a1.dtype)  # <U5
print(num_a1.dtype)  # float64

# 정수를 문자열 원소로 갖는 배열을 정수로 변환하는 예.
str_a2 = np.array(['1', '3', '5', '7', '9'])
num_a2 = str_a2.astype(int)
print(str_a2.dtype)  # <U1
print(num_a2)  # [1 3 5 7 9]
print(num_a2.dtype)  # int64

 


 

5) 난수 배열의 생성

👾  rand() 함수를 이용하면 실수 난수를 요소로 갖는 배열을 생성
👾  randint() 함수를 이용하면 정수 난수를 요소로 갖는 배열을 생성

rand_num = np.random.rand([d0, d1, ..., dn])
rand_num = np.random.randint([low,] high [, size])

 

    📌  rand() 함수는 [0, 1) 사이의 실수 난수를 갖는 배열을 생성
            ▶️  [a, b)의 표현은 배열 크기
    📌  randint() 함수는 [low, high) 사이의 정수 난수를 갖는 배열을 생성
            ▶️ size는 배열의 형태 지정
            ▶️ low를 입력하지 않으면 0으로 간주
            ▶️ size를 입력하지 않으면 1로 간주

 

a1 = np.random.rand(2, 3)
print(a1)
# [[0.4980917  0.8726201  0.73129453]
#  [0.0029339  0.16124396 0.4579657 ]]

a2 = np.random.rand()
print(a2)  # 0.9081515820816426

a3 = np.random.rand(2, 3, 4)
print(a3)
# [[[0.03399706 0.84441171 0.17392205 0.09881563]
#   [0.98804228 0.5106279  0.49711395 0.34850446]
#   [0.12695874 0.70715927 0.08024678 0.58860936]]
#
#  [[0.02316629 0.75390742 0.09401929 0.56745535]
#   [0.10507769 0.53669669 0.35367215 0.1756888 ]
#   [0.02745259 0.90007949 0.42169534 0.46447165]]]

a4 = np.random.randint(10, size=(3, 4))
print(a4)
# [[9 9 5 6]
#  [3 3 5 5]
#  [9 3 5 3]]

a5 = np.random.randint(1, 30)
print(a5)  # 23

a6 = np.random.randint(1, 30, 3)
print(a6) # [ 3 19 17]

 

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]

+ Recent posts