PYTHON/Pandas 판다스

[PYTHON] NUMPY 넘파이

G허니 2024. 3. 1. 16:53

Numpy는 파이썬에서 벡터, 행렬 등 수치 연산을 효율적으로 처리할 수 있게 도와주는 라이브러리입니다. Numpy 배열은 1차원, 2차원, 3차원등 다차원 배열을 생성할 수 있고, Reshape 기능을 활용하여 배열의 형태를 자유롭게 변경할수 있습니다. 물론, 데이터를 조회하는 기법인 인덱싱과 슬라이싱을 통해 원하는 데이터를 효과적으로 뽑아낼수 있습니다.

 

라이브러리 불러오기


Numpy 배열을 사용하려면 먼저 numpy 라이브러리를 불러와야 합니다. numpy 라이브러리는 일반적으로 np라는 별칭을 붙여 불러옵니다.

 

import numpy as np

 

 

용어 정의

 

[용어]

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

[3 x 4 배열의 경우]

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

[3차원의 경우]

  • z = axis 0
  • x = axis 1
  • y = axis 2

 

배열 만들기


Numpy 배열을 간단하게 배열이라고 부르겠습니다. 이후 데이터 처리 시 배열로 변환해 연산을 하거나, 결과가 배열로 표시되는 경우가 있습니다. 배열에 대한 개념은 정확히 파악해 두는 것이 중요합니다.

 

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

 

1) 1차원 배열 만들기

# 1차원 리스트
a1 = [10, 20, 30, 40, 50]

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

# 확인
print(b1)
print(type(b1))

 

2) 2차원 배열 만들기

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

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

# 확인
print(b2)


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)

 

 

배열 정보 확인


배열 정보를 확인하는 다음 속성들을 기억하시기 바랍니다. 특히 shape 속성은 이후에도 많이 사용될 것입니다.

 

nidm과 shape는 튜플형태로 반환됩니다.


1) 차원 확인

# 차원 확인
print(b1.ndim)
print(b2.ndim)
print(b3.ndim)

 

2) 형태(크기) 확인

# 형태(크기) 확인 -> 튜플로 출력
print(b1.shape)
print(b2.shape)
print(b3.shape)


3) 요소 자료형 확인

# 요소 자료형 형식 확인
print(b1.dtype)

 

 

 

Reshape


배열을 사용할 때 다양한 형태(Shape)로 변환할 필요가 있습니다. 배열에 포함된 요소가 사라지지 않는 형태라면 자유롭게 변환할 수 있습니다.

 

# (3, 2) 형태의 2차원 배열 만들기
a = np.array([[10, 20],
              [30, 40]])

# 확인
print(a)

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

# 확인
print(b)

 

  • (2, 3) → (3, 2)
  • (2, 3) → (6,)
  • (m, -1) 또는 (-1, n) 처럼 사용해 행 또는 열 크기 한 쪽만 지정할 수 있습니다.

 

인덱싱

 

1차원 배열의 인덱싱은 리스트와 동일하므로, 본 글에서는 생략하겠습니다. 대신, 다차원 배열에서의 인덱싱 방법에 초점을 맞추겠습니다. 배열에 접근하기 위해 '배열[행, 열]' 형태를 사용할 수 있습니다. 이를 통해 특정 위치의 요소를 쉽게 조회할 수 있습니다.

또한, '배열[[행1,행2,..], :]' 또는 '배열[[행1,행2,..]]' 형태를 사용하여 특정 행을 조회할 수 있습니다. 반대로, '배열[:, [열1,열2,...]]' 형태를 사용해 특정 열을 조회할 수 있습니다. 그리고 '배열[[행1,행2,...], [열1,열2,...]]' 형태를 통해 특정 행의 특정 열을 조회하는 것도 가능합니다.

 

# (4, 4) 형태의 2차원 배열 만들기
a = np.array([[1, 2, 3, 4],
              [5, 6, 7, 8],
              [9, 10, 11, 12],
              [13, 14, 15, 16]])

# 확인
print(a)

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

 

# 첫 번째, 두 번째 행 조회
# print(a[[0, 1], :])
print(a[[0, 1]])

 

# 첫 번째, 두 번째 열 조회
print(a[:, [0, 1]])

 

# 두 번째 행 두 번째 열의 요소 조회
print(a[[1], [1]])

 

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

 

슬라이싱


슬라이싱은 배열의 일부분을 잘라내어 보는 방법입니다. '배열[행1:행N,열1:열N]' 형태로 지정해 그 위치의 요소를 조회할 수 있습니다. 이때, 조회 결과는 2차원 배열이 됩니다. 주의할 점은 마지막 범위 값은 대상에 포함되지 않는다는 것입니다. 즉, '배열[1:M, 2:N]' 이라면 1 ~ M-1행, 2 ~ N-1열이 조회 대상이 됩니다.

 

# 첫 번째 ~ 두 번째 행 조회
# print(a[0:2, :])
print(a[0:2])

 

# 첫 번째 행, 첫 번째 ~ 두 번째 열 조회
print(a[0, 0:2])

 

# 첫 번째 ~ 세 번째 행, 두 번째 ~ 세 번째 열 조회
print(a[0:3, 1:3])

 

조건 조회


조건 조회는 조건에 맞는 요소를 선택하는 방식으로, 불리안 인덱싱이라고도 부릅니다. 이 방법을 사용하면, 주어진 조건을 만족하는 요소들만을 선택하여 조회할 수 있습니다. 조건 조회의 결과는 1차원 배열이 됩니다. 이 방법은 복잡한 조건을 통한 데이터 필터링에 매우 유용하게 사용됩니다.

 

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

 

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

 

# 모든 요소 중에서 3 이상 5 미만인 것만 조회
cond1 = a>=3
cond2 = 5>a

print(a[cond1 & cond2])

 & 와 | 로 연결하여 조회할 수 있습니다.

 

 

배열 연산


배열 사이의 더하기, 빼기, 곱하기, 나누기 등은 이해하기 쉽습니다. 하지만 행렬 곱, 행렬 합 등의 연산은 약간의 수학적 지식이 필요합니다. 행렬 연산은 선형 대수를 위한 것이므로 설명을 생략합니다.

 

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

# 확인
print(x)
print(y)

# 배열 더하기
print(x + y)
print(np.add(x, y))


# 배열 빼기
print(x - y)
print(np.substract(x, y))

# 배열 곱하기
print(x * y)
print(np.multiply(x, y))

# 배열 나누기
print(x / y)
print(np.divide(x, y))

# 배열 제곱
print(x ** 2)
print(np.power(x, y))