파이썬 마스터하기 : Numpy

서쿠·2023년 5월 8일
8

python-viz

목록 보기
1/6
post-thumbnail

NumPy란?

NumPy는 Python에서 과학 연산을 위한 가장 기본적인 패키지 중 하나입니다. NumPy는 "Numeric Python"의 약자이며 대규모 다차원 배열과 행렬 연산에 필요한 다양한 함수와 메소드를 제공합니다. NumPy는 데이터 분석, 데이터 처리, 선형 대수, 머신 러닝 등 다양한 분야에서 널리 사용되고 있습니다.

NumPy의 설치

NumPy를 사용하기 위해서는 먼저 NumPy 패키지를 설치해야 합니다. 아래의 명령어를 사용하여 NumPy를 설치할 수 있습니다.

pip install numpy

NumPy 배열 생성

NumPy에서 가장 기본적인 데이터 구조는 배열입니다. NumPy 배열은 동일한 타입의 데이터를 담는 다차원 배열입니다. NumPy 배열은 ndarray 클래스를 사용하여 생성할 수 있습니다. NumPy 배열을 생성하는 방법은 다음과 같습니다.

import numpy as np

# 1차원 배열 생성
a = np.array([1, 2, 3])

# 2차원 배열 생성
b = np.array([[1, 2, 3], [4, 5, 6]])

# 3차원 배열 생성
c = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])

NumPy 배열의 크기를 확인하는 방법은 shape 속성을 사용합니다. (출력값은 옆에 주석 참고)

print(a.shape)  # (3,)
print(b.shape)  # (2, 3)
print(c.shape)  # (2, 2, 2)

NumPy 배열 연산

NumPy 배열은 다른 배열 또는 스칼라와의 연산을 지원합니다. NumPy 배열의 연산은 배열의 원소별(element-wise)로 이루어집니다.

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# 원소별 덧셈
c = a + b  # [5, 7, 9]

# 원소별 곱셈
d = a * b  # [4, 10, 18]

# 스칼라와의 연산
e = a + 1  # [2, 3, 4]

NumPy 배열의 연산에는 다양한 함수와 메소드가 있습니다. 가장 기본적인 연산은 sum, mean, min, max입니다.

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

# 합계
b = np.sum(a)  # 6

# 평균
c = np.mean(a)  # 2.0

# 최소값
d = np.min(a)  # 1

# 최대값
e = np.max(a)  # 3

NumPy 배열 인덱싱과 슬라이싱

NumPy 배열의 인덱싱과 슬라이싱은 Python 리스트의 인덱싱과 슬라이싱과 매우 유사합니다. NumPy 배열의 인덱싱과 슬라이싱을 사용하여 배열의 일부를 선택할 수 있습니다.

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

# 인덱싱
b = a[0]  # 1
c = a[2]  # 3

# 슬라이싱
d = a[1:4]  # [2, 3, 4]
e = a[:3]   # [1, 2, 3]
f = a[3:]   # [4, 5]

다차원 NumPy 배열에서는 각 차원의 인덱스를 콤마로 구분하여 인덱싱할 수 있습니다.

a = np.array([[1, 2, 3], [4, 5, 6]])

# 인덱싱
b = a[0, 0]  # 1
c = a[1, 2]  # 6

# 슬라이싱
d = a[0, 1:3]  # [2, 3]
e = a[:, 1]    # [2, 5]
f = a[:, :2]   # [[1, 2], [4, 5]]

NumPy 배열 형태 변경

NumPy 배열의 형태를 변경하는 방법은 다음과 같습니다.

a = np.array([[1, 2], [3, 4], [5, 6]])

# 배열의 형태 변경
b = a.reshape((2, 3))  # [[1, 2, 3], [4, 5, 6]]

# 배열 전치
c = a.T  # [[1, 3, 5], [2, 4, 6]]

NumPy 배열 병합과 분리

NumPy 배열을 병합하는 방법은 다음과 같습니다.

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# 배열 병합
c = np.concatenate((a, b))  # [1, 2, 3, 4, 5, 6]

다차원 NumPy 배열을 병합하는 방법은 concatenate() 함수를 사용합니다. concatenate() 함수는 병합할 배열을 첫 번째 인자로 전달하며, 두 개 이상의 배열을 병합할 경우에는 튜플 형태로 전달합니다. axis 인자를 사용하여 병합할 방향을 지정할 수 있습니다. axis 인자를 지정하지 않을 경우 기본값인 0으로 설정됩니다.

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])

# 배열 병합
c = np.concatenate((a, b), axis=0)  # [[1, 2], [3, 4], [5, 6]]

위의 예제에서 concatenate() 함수의 axis=0은 첫 번째 차원을 따라 배열을 병합한다는 의미입니다. 따라서 위의 예제에서는 ab 배열이 첫 번째 차원을 공유하므로 axis=0으로 설정하여 배열을 병합할 수 있습니다.

NumPy 배열을 분리하는 방법은 다음과 같습니다.

a = np.array([1, 2, 3, 4, 5, 6])

# 배열 분리
b, c = np.split(a, [3])  # [1, 2, 3], [4, 5, 6]

다차원 NumPy 배열을 분리하는 방법은 split() 함수를 사용합니다. split() 함수는 분리할 배열과 분리할 인덱스를 전달하며, 분리할 인덱스는 분리될 배열의 첫 번째 차원을 따라 지정합니다. split() 함수는 분리된 배열을 튜플 형태로 반환합니다.

a = np.array([[1, 2, 3], [4, 5, 6]])

# 배열 분리
b, c = np.split(a, [1], axis=0)  # [[1, 2, 3]], [[4, 5, 6]]

위의 예제에서 split() 함수의 axis=0은 첫 번째 차원을 따라 배열을 분리한다는 의미입니다. 따라서 위의 예제에서는 a 배열의 첫 번째 행을 기준으로 배열을 분리할 수 있습니다.

이제 마지막으로 NumPy 배열을 다룰 때 유용한 몇 가지 함수를 소개하겠습니다.

NumPy 주요 함수

NumPy는 배열의 계산과 관련된 다양한 함수를 제공합니다. 이 중에서 가장 많이 사용되는 함수들은 다음과 같습니다.

  • np.zeros(): 모든 원소가 0인 배열을 생성합니다.
  • np.ones(): 모든 원소가 1인 배열을 생성합니다.
  • np.arange(): 범위 내의 일정 간격을 가진 배열을 생성합니다.
  • np.linspace(): 범위 내에서 균등 간격으로 원하는 개수의 배열을 생성합니다.
  • np.random.random(): 0부터 1사이의 난수를 가지는 배열을 생성합니다.
  • np.random.randn(): 평균이 0이고 표준편차가 1인 정규 분포를 따르는 난수를 가지는 배열을 생성합니다.

이 외에도 NumPy는 다양한 수학 함수를 제공합니다. 예를 들어, np.sin(), np.cos(), np.exp(), np.log() 등이 있습니다. 이러한 함수들은 NumPy 배열에서 사용되어 배열의 원소들을 계산합니다.

각각에 대해서 좀 더 자세하게 살펴보도록 하겠습니다.

np.zeros()

np.zeros() 함수는 모든 원소가 0인 배열을 생성합니다. 함수의 인수로는 생성할 배열의 크기를 지정합니다. 예를 들어, 크기가 2x3인 배열을 생성하려면 다음과 같이 코드를 작성합니다.

import numpy as np

arr = np.zeros((2, 3))
print(arr)

위 코드의 출력 결과는 다음과 같습니다.

[[0. 0. 0.]
 [0. 0. 0.]]

위의 출력 결과에서 보듯이 np.zeros() 함수는 모든 원소가 0인 배열을 생성합니다.

np.ones()

np.ones() 함수는 모든 원소가 1인 배열을 생성합니다. 함수의 인수로는 생성할 배열의 크기를 지정합니다. 예를 들어, 크기가 2x4인 배열을 생성하려면 다음과 같이 코드를 작성합니다.

import numpy as np

arr = np.ones((2, 4))
print(arr)

위 코드의 출력 결과는 다음과 같습니다.

[[1. 1. 1. 1.]
 [1. 1. 1. 1.]]

위의 출력 결과에서 보듯이 np.ones() 함수는 모든 원소가 1인 배열을 생성합니다.

np.arange()

np.arange() 함수는 범위 내의 일정 간격을 가진 배열을 생성합니다. 함수의 인수로는 생성할 배열의 범위와 간격을 지정합니다. 예를 들어, 범위가 1에서 10까지이고 간격이 2인 배열을 생성하려면 다음과 같이 코드를 작성합니다.

import numpy as np

arr = np.arange(1, 10, 2)
print(arr)

위 코드의 출력 결과는 다음과 같습니다.

[1 3 5 7 9]

위의 출력 결과에서 보듯이 np.arange() 함수는 범위 내의 일정 간격을 가진 배열을 생성합니다.

np.linspace()

np.linspace() 함수는 범위 내에서 균등 간격으로 원하는 개수의 배열을 생성합니다. 함수의 인수로는 생성할 배열의 범위와 원하는 개수를 지정합니다. 예를 들어, 범위가 0에서 1까지이고 원하는 개수가 5개인 배열을 생성하려면 다음과 같이 코드를 작성합니다.

import numpy as np

arr = np.linspace(0, 1, 5)
print(arr)

위 코드의 출력 결과는 다음과 같습니다.

[0.   0.25 0.5  0.75 1.  ]

위의 출력 결과에서 보듯이 np.linspace() 함수는 범위 내에서 균등 간격으로 원하는 개수의 배열을 생성합니다.

np.random.random()

np.random.random() 함수는 0과 1사이의 균등 분포에서 난수를 생성하여 배열을 만듭니다. 함수의 인수로는 생성할 배열의 크기를 지정할 수 있습니다. 예를 들어, 크기가 3x3인 배열을 생성하려면 다음과 같이 코드를 작성합니다.

import numpy as np

arr = np.random.random((3, 3))
print(arr)

위 코드의 출력 결과는 다음과 같습니다.

[[0.8139928  0.79544491 0.43146849]
 [0.30136094 0.77515306 0.64259144]
 [0.02956163 0.74888294 0.56169272]]

위의 출력 결과에서 보듯이 np.random.random() 함수는 지정된 크기의 배열을 생성하며, 배열의 각 원소는 0과 1 사이의 난수로 채워집니다.

np.random.randn()

np.random.randn() 함수는 평균이 0이고 표준편차가 1인 정규 분포를 따르는 난수를 생성하여 배열을 만듭니다. 함수의 인수로는 생성할 배열의 크기를 지정할 수 있습니다. 예를 들어, 크기가 2x4인 배열을 생성하려면 다음과 같이 코드를 작성합니다.

import numpy as np

arr = np.random.randn(2, 4)
print(arr)

위 코드의 출력 결과는 다음과 같습니다.

[[ 0.52346546  0.30785207  0.63301317 -0.03108197]
 [ 1.37352221 -1.26632616 -1.15567608 -0.52687134]]

위의 출력 결과에서 보듯이 np.random.randn() 함수는 지정된 크기의 배열을 생성하며, 배열의 각 원소는 평균이 0이고 표준편차가 1인 정규 분포를 따르는 난수로 채워집니다.

NumPy 기타 함수

그 외에도 Numpy에는 많은 유용한 함수들이 내장되어 있는데 대표적인 몇가지 함수들을 소개해드리려고 합니다.

Numpy 수학 함수

앞에서 이미 많이 쓰이는 함수로 sum(), mean(), min(), max()를 소개한 바 있지만, 해당 함수를 말고도 다양한 함수들이 존재합니다.

  • sum(), mean() : 배열 전체 합, 평균
  • cumsum(), cumprod() : 배열 누적 합, 누적 곱
  • std(), var() : 표준편차, 분산
  • min(), max() : 최소값, 최대값
  • argmin(), argmax(): 최소 원소의 색인 값, 최대 원소의 색인 값

Numpy 난수 함수

NumPy 모듈의 랜덤 함수를 사용하여 다양한 분포에서 난수를 생성할 수 있습니다. 이를 통해 데이터의 모의 실험을 수행하거나 시뮬레이션을 구현할 수 있습니다. numpy.random 모듈의 경우는 다양한 종류의 확률분포로부터 효과적으로 표본 값을 생성하는데 사용됩니다.

  • seed() : 난수 발생기의 seed를 지정한다.
  • permutation() : 임의의 순열을 반환한다.
  • shuffle() : 리스트나 배열의 순서를 뒤섞는다.
  • rand() : 균등분포에서 표본을 추출한다.
  • randint() : 주어진 최소/최대 범위 안에서 임의의 난수를 추출한다.
  • randn() : 표준편차가 1이고 평균값이 0인 정규분포에서 표본을 추출한다.
  • binomial() : 이항분포에서 표본을 추출한다.
  • normal() : 정규분포(가우시안)에서 표본을 추출한다.
  • beta() : 베타분포에서 표본을 추출한다.
  • chisquare() : 카이제곱분포에서 표본을 추출한다.
  • gamma() : 감마분포에서 표본을 추출한다.
  • uniform() : 균등(0,1)에서 표본을 추출한다.

🤔 아니 근데 normal 함수랑 randn 함수는 둘다 정규분포 아닌가요?

📣 네! 맞습니다. 하지만, randn() 함수와 normal() 함수는 모두 정규분포에서 난수를 생성합니다. 하지만 두 함수에는 약간의 차이점이 있습니다.

  • randn() 함수는 표준편차가 1이고 평균이 0인 표준정규분포(standard normal distribution)에서 난수를 생성합니다. 즉, 다른 파라미터가 주어지지 않은 경우, randn() 함수는 normal(0, 1)과 동일한 역할을 합니다.

  • 반면에, normal() 함수는 평균값(mu)과 표준편차(sigma)를 지정할 수 있습니다. 예를 들어, 다음과 같이 평균값이 2이고 표준편차가 3인 정규분포에서 2x2 크기의 배열을 생성하는 코드를 작성할 수 있습니다.

import numpy as np

arr = np.random.normal(loc=2, scale=3, size=(2, 2))
print(arr)

위 코드의 출력 결과는 다음과 같습니다.

[[ 0.17468078  2.09660262]
 [ 0.03441699 -1.12143515]]

위의 출력 결과에서 보듯이, normal() 함수는 평균값과 표준편차를 지정할 수 있습니다.

결론

이상으로 NumPy에 대한 기본적인 사용 방법과 함수에 대해 알아보았습니다. NumPy는 데이터 처리와 분석, 과학 계산, 머신 러닝 등 다양한 분야에서 널리 사용되고 있으며, 다양한 기능과 메소드를 제공하기 때문에 데이터 분석 및 처리에 유용한 패키지 중 하나입니다.

profile
Always be passionate ✨

0개의 댓글