에이블스쿨 6기 DX 트랙/일일 복습

DAY 07. 넘파이 기초

d061120 2024. 9. 18. 18:53

1. 라이브러리 불러오기

  • Numpy 배열을 사용하려면 우선 numpy 라이브러리를 불러와야 합니다.
  • numpy 라이브러리는 일반적으로 np 별칭을 붙여 불러옵니다.
# 라이브러리 불러오기
import numpy as np

 

2. 배열 만들기

  • 데이터 처리시 배열로 변환해 연산을 하거나, 결과가 배열로 표시되는 경우가 있음

2.1. 용어 정의

[용어]

  • axis: 배열의 각 축
  • rank: 축의 개수
  • shape: 축의 길이, 배열의 크기

[3 x 4 배열의 경우]

  • axis 0 과 axis 1 을 갖는 2차원 배열
  • rank 2 array
  • shape는 (3, 4)

2.2. 배열 만들기

  • np.array() 함수를 사용해서 배열을 만듭니다.
  • 대부분 리스트로부터 배열을 만들거나, 머신러닝 관련 함수 결괏값이 배열이 됩니다.

2.2.1. 배열 만들기

1) 1차원 배열 만들기

# 1차원 리스트
a1 = [1, 2, 3, 4, 5]

# 배열로 변환
b1 = np.array(a1)

# 확인
print(b1)
---
# 출력
# [1 2 3 4 5]

 

2) 2차원 배열 만들기

# 2차원 리스트(List of List)
a2 = [[1.5, 2.5, 3.2],
      [4.2, 5.7, 6.4]]

# 배열로 변환
b2 = np.array(a2)

# 확인
print(b2)
---
# 출력
# [[1.5 2.5 3.2]
#  [4.2 5.7 6.4]]
  • 배열의 특징
    • 배열은 한 번에 한 가지의 자료형만 가질 수 있다.
      (위 배열에서 숫자 하나를 문자열로 바꾸면 다른 숫자도 모두 문자열로 바뀐다.)
    • 각 리스트의 자료 수가 다르면 배열이 생성되지 않는다. (배열은 무조건 요소 개수가 같아야 한다.)

3) 3차원 배열 만들기

# 3차원 리스트
a3 = [[[1, 3, 1],
       [4, 7, 6],
       [8, 3, 4]],
      [[6, 2, 4],
       [8, 1, 5],
       [3, 5, 9]]]

# 배열로 변환
b3 = np.array(a3)

# 확인
print(b3)
---
# 출력
# [[[1 3 1]
#  [4 7 6]
#  [8 3 4]]
#
# [[6 2 4]
#  [8 1 5]
#  [3 5 9]]]

 

2.2.2. 배열 정보 확인

1) 차원 확인

  • ndim 속성으로 배열 차원 확인
# 차원 확인
print(b1.ndim)
print(b2.ndim)
print(b3.ndim)
---
# 출력
# 1
# 2
# 3

 

2) 형태(크기) 확인

  • shape 속성으로 배열 형태를 확인합니다.
  • 결과는 다음과 같은 형태의 튜플로 표시됩니다.
    • 1차원: (x, )
    • 2차원: (x, y)
    • 3차원: (x, y, z)
  • 앞에서 부터 axis 0, axis 1, axis 2의 크기를 의미합니다.
# 형태(크기) 확인
print(b1.shape)
print(b2.shape)
print(b3.shape)
---
# 출력
# (5,)
# (2, 3)
# (2, 3, 3)

 

3) 요소 자료형 확인

  • dtype 속성으로 배열에 포함된 요소들의 자료형을 확인합니다.
  • 배열은 한 가지 자료형만 가질 수 있다는 특징이 있습니다.
# 요소 자료형 형식 확인
print(b1.dtype)
print(b2.dtype)
print(b3.dtype)
---
# 출력
# int32
# float64
# int32

 

2.2.3. Reshape

  • 배열에 포함된 요소가 사라지지 않는 형태라면 자유롭게 변환 가능
  • (3, 2) → (2, 3) → (1, 6) → (6, 1) 등등 요소 개수만 변하지 않으면
# (2, 3) 형태의 2차원 배열 만들기
a = np.array([[1, 2, 3],
              [4, 5, 6]])

# 확인
print(a)
---
# 출력
# [[1 2 3]
#  [4 5 6]]

 

1) (2, 3) → (3, 2)

# (3, 2) 형태의 2차원 배열로 Reshape
b = a.reshape(3, 2)

# 확인
print(b)
---
# 출력
# [[1 2]
#  [3 4]
#  [5 6]]

 

np.reshape() 함수 사용

# np.reshape() 함수 사용
b = np.reshape(a, (3, 2))

# 확인
print(b)
---
# 출력
# [[1 2]
#  [3 4]
#  [5 6]]

 

※ np.reshape() 함수는 다른 자료형도 변환 가능

# np.reshape() 함수는 다른 자료형도 변환시킨다.
# 리스트 선언
a1 = [1, 2, 3, 4, 5, 6]

# reshape
b1 = np.reshape(a1, (3, 2))

# 확인
print(b1)
---
# 출력
# [[1 2]
#  [3 4]
#  [5 6]]

 

2) (2, 3) → (6,)

# 1차원 배열로 Reshape
c = a.reshape(6,)

# 또는
# c = np.reshape(a, (6,))

# 확인
print(c)
---
# 출력
# [1 2 3 4 5 6]

 

3) -1의 편리성

  • (m, -1) 또는 (-1, n) 처럼 사용해 행 또는 열 크기 한 쪽만 지정할 수 있음
# (2, 3) 형태의 2차원 배열 만들기
a = np.array([[1, 2, 3],
              [4, 5, 6]])
              
# reshape(m, -1) 형태로 지정하여 Reshape 가능
print(a.reshape(1, -1))
print()

print(a.reshape(2, -1))
print()

print(a.reshape(3, -1))
print()

print(a.reshape(6, -1))
---
# 출력
# [[1 2 3 4 5 6]]
# 
# [[1 2 3]
#  [4 5 6]]
# 
# [[1 2]
#  [3 4]
#  [5 6]]
# 
# [[1]
#  [2]
#  [3]
#  [4]
#  [5]
#  [6]]

 

3. 배열 인덱싱과 슬라이싱

3.1. 인덱싱

  • 1차원 배열은 리스트와 방법이 같음
  • 배열[행, 열] 형태로 특정 위치의 요소 조회
  • 배열[[행1,행2,..], :] 또는 배열[[행1,행2,..]] 형태로 특정 행 조회
  • 배열[:, [열1,열2,...]] 형태로 특정 열 조회
  • 배열[[행1,행2,...], [열1,열2,...]] 형태로 특정 행의 특정 열 조회
# (3, 3) 형태의 2차원 배열 만들기
a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

# 확인
print(a)
---
# 출력
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]

 

1) 요소 조회

# 첫 번째 행, 두 번째 열 요소 조회
print(a[0, 1])
---
# 출력
# 2

 

2) 행 조회 (열 부분의 ':' 생략 가능)

# 첫 번째, 두 번째, 세 번째 행 조회
# print(a[[0, 1, 2], :])  # 행 조회 시 ':'은 생략 가능
print(a[[0, 1, 2]])
---
# 출력
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]

 

3) 열 조회 (행 부분의 ':' 생략 불가능 → 생략하면 행 기준으로 조회가 됨)

# 첫 번째, 두 번째 열 조회
print(a[:, [0, 1]])
---
# 출력
# [[1 2]
#  [4 5]
#  [7 8]]

 

4) 행, 열 조회

# 첫 번째 행 첫 번째 열, 두 번째 행 두 번째 열, 세 번째 행 첫 번째 열의 요소 조회
print(a[[0, 1, 2], [0, 1, 0]])
---
# 출력
# [1 5 7]

 

3.2. 슬라이싱

  • 배열[행1:행N,열1:열N] 형태로 지정해 그 위치의 요소 조회
  • 조회 결과는 2차원 배열
  • 마지막 범위 값은 대상에 포함되지 않음
  • 즉, 배열[1:M, 2:N] 이라면 1 ~ M-1행, 2 ~ N-1열이 조회 대상
# (3, 3) 형태의 2차원 배열 만들기
a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
              
# 첫 번째 ~ 세 번째 행, 두 번째 ~ 세 번째 열 조회
print(a[0:3, 1:3])

# 두 번째 ~ 끝 행, 두 번째 ~ 끝 열 조회
print(a[1:, 1:])
---
# 출력
# [[2 3]
#  [5 6]
#  [8 9]]
#  
# [[5 6]
#  [8 9]]

 

3.3. 조건 조회

  • 조건에 맞는 요소를 선택하는 방식, 불리안 방식이라고 부름
  • 조회 결과는 1차원 배열
# 2차원 배열 만들기
score= np.array([[78, 91, 84, 89, 93, 65],
                 [82, 87, 96, 79, 91, 73]])

# 요소 중에서 90 이상인 것만 조회
print(score[score >= 90])

# 요소 중에서 90 이상인 것만 조회
c = score >= 90
print(score[c])

# 모든 요소 중에서 90 이상 95 미만인 것만 조회
print(score[(score >= 90) & (score < 95)])
---
# 출력
# [91 93 96 91]
# [91 93 96 91]
# [91 93 91]

 

4. 배열 연산

# 두 개의 (2, 2) 형태의 2차원 배열 만들기
x = np.array([[1, 2], [3, 4]])
y = np.array([[5, 6], [7, 8]])

# 확인
print(x)
print(y)
---
# 출력
# [[1 2]
#  [3 4]]
# [[5 6]
#  [7 8]]

 

1) 배열 더하기

# 배열 더하기
print(x + y)

# 또는
print(np.add(x, y))
---
# 출력
# [[ 6  8]
#  [10 12]]
# [[ 6  8]
#  [10 12]]

 

2) 배열 빼기

# 배열 빼기
print(x - y)

# 또는
print(np.subtract(x, y))
---
# 출력
# [[-4 -4]
#  [-4 -4]]
# [[-4 -4]
#  [-4 -4]]

 

3) 배열 곱하기

# 배열 곱하기
print(x * y)

# 또는
print(np.multiply(x, y))
---
# 출력
# [[ 5 12]
#  [21 32]]
# [[ 5 12]
#  [21 32]]

 

4) 배열 나누기

# 배열 나누기
print(x / y)

# 또는
print(np.divide(x, y))
---
# 출력
# [[0.2        0.33333333]
#  [0.42857143 0.5       ]]
# [[0.2        0.33333333]
#  [0.42857143 0.5       ]]

 

5) 배열 제곱

# 배열 y 제곱
print(x ** y)

# 또는
print(np.power(x, y))
---
# 출력
# [[    1    64]
#  [ 2187 65536]]
# [[    1    64]
#  [ 2187 65536]]

 

6) 행렬의 곱

# 행렬의 곱
print(x.dot(y))
---
# 출력
# [[19 22]
#  [43 50]]

'에이블스쿨 6기 DX 트랙 > 일일 복습' 카테고리의 다른 글

DAY 07. 데이터프레임 탐색  (0) 2024.09.18
DAY 07. 데이터프레임 생성  (3) 2024.09.18
DAY 05. 함수  (1) 2024.09.12
DAY 04. 제어문  (0) 2024.09.11
DAY 03. 딕셔너리 자료형  (3) 2024.09.06