Numpy는?
Numpy는 행렬이나 일반적으로 대규모 다차원 배열을 쉽게 처리할 수 있도록 지원하는 파이썬의 라이브러리이다.
Numpy는 주로 데이터 분석, 데이터 처리, 선형 대수, 머신 러닝 등 여러 분야에서 사용되고 있습니다.
Numpy 설치해보기
Numpy는 Python 라이브러리이기 때문에 Python의 패키지 관리자인 pip을 통해 설치가 가능합니다.
(pip가 설치되지 않았을 경우 pip를 먼저 설치합니다.)
$ pip install numpy
Numpy 배열 생성해보기
Numpy에서 가장 기본 구조는 배열로 이루어져 있으며, 동일한 타입의 데이터를 담는 다차원 배열입니다.
np.array 클래스를 통해 배열을 생성할 수 있습니다.
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]]])
배열 살펴 보기
import numpy as np
arr = np.array([[1,2,3],[4,5]])
print(arr, type(arr))
type을 통해 타입을 확인해 보면 <class 'numpy.ndarry'>라고 표시되고 있습니다.
python의 list와 비슷한 모양으로 보이지만 약간의 차이가 있습니다.
아래 2가지 외에 연산, 메서드의 차이가 있으나, 간단히 기술하겠습니다.
- 원소의 자료형이 서로 다를 때
- List : 원소가 숫자, 문자와 같이 서로 다른 속성의 자료형을 갖더라도 한 번에 선언이 가능하다.
- Array : 하나의 자료형으로 자동 변환된다.
np.array([1,2,3,4, '문자']) 일 경우 출력은 array(['1', '2', '3', '4', '문자'])로 모두 자료형으로 출력된다.
- 2차원 이상 배열 구조일 때
- List : 배열의 원소 구조가 달라도 상관없다.
- Array : 배열의 원소 구조가 모두 동일해야 한다.
# List
a = [[1], [2,3], [4,5,6]]
print(a)
# numpy
b = np.array([[1], [2,3], [4,5,6]])
print(b)
c = np.array([[1,2], [3,4], [5,6]])
print(c)
위와 같이 원소 구조를 달리하여 출력한 값은 아래와 같습니다.
원소가 동일하지 않을 경우 시퀀스 단계에서 에러가 발생합니다. 따라서, np.array의 경우 원소 구조가 같아야 합니다.
print(a) : [[1], [2, 3], [4, 5, 6]]
print(b): ValueError: setting an array element with a sequence.
The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (3,) + inhomogeneous part
print(c): [[1 2]
[3 4]
[5 6]]
조금 더 살펴보기
import numpy as np
arr = np.array([[1,2,3],[4,5]])
print(arr.ndim, arr.size, arr.shape)
# 출력값 1 5 (5,)
여기서 출력한 array의 속성은 각가 다음과 같은 의미를 가지고 있습니다.
- ndim : 배열의 차원 수를 나타냅니다.
- size : 배열의 전체 요소 개수를 나타냅니다.
- shape : 각 차원의 크기를 튜플로 나타냅니다.
각 속성의 의미로 출력 값을 설명해보면 arr 배열은 1차원으로 5개의 요소를 가지고 있고, 1차원 배열로 길이가 5이기 때문에 (5,)로 표현합니다.
dtype
위에 언급한 내용과 같이 numpy array는 모두 같은 type이어야 합니다.
이러한 조건을 위해 dtype이라는 특성을 정의할 수 있습니다. docs
arr_float = np.array([1., 2, 3, 4, 5])
print(arr_float.dtype, arr_float.dtype)
2,3,4,5는 정수이지만 arr_float 속성으로 인해 실수형으로 정의된 것을 확인할 수 있습니다.
arange
arange 함수는 지정된 범위 내에서 균일한 간격의 값들로 이뤄진 배열을 생성할 수 있습니다.
python 내용 함수인 range와 유사하나, numpy 배열을 반환한다는 데에 차이가 있습니다.
arange 기본 사용법
numpy.arange([start,] stop[, step,], dtype=None)
파라미터
- start : 시작값 (기본값은 0)
- stop : 끝값 (끝값은 포함되지 않음)
- step : 간격 (기본값은 1)
- dtype : 배열의 데이터 타입
import numpy as np
# 0부터 4까지의 정수 배열 생성
print(np.arange(5)) # [0 1 2 3 4]
# 2부터 9까지 2 간격으로 배열 생성
print(np.arange(2, 10, 2)) # [2 4 6 8]
# 소수점 간격도 가능
print(np.arange(0, 2, 0.3)) # [0. 0.3 0.6 0.9 1.2 1.5 1.8]
# 데이터 타입 지정
print(np.arange(5, dtype=float)) # [0. 1. 2. 3. 4.]
linspace
linspace는 arange와 달리 3개의 인자를 받습니다.
linspace 기본 사용법
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
파라미터
- start : 시작값
- stop : 끝값(기본적으로 끝값 포함)
- num : 생성할 샘플의 개수 (기본값 50)
- endpoint : True면 stop을 포함, False라면 미포함 (기본은 True)
arange와 차이점
- 요소 개수 지정 : arange는 간격을 지정하는 반면, linspace는 생성할 요소의 개수를 직접 지정합니다.
- 끝점 포함 : 기본적으로 끝점을 포함합니다. arange는 끝점을 포함하지 않습니다.
- 균등 분포 : 시작점과 끝점 사이를 항상 균등하게 생성합니다.
linspace 예제
import numpy as np
# 0부터 4까지 5개의 균등 분포된 숫자 생성
print(np.linspace(0, 4, 5))
# [0. 1. 2. 3. 4.]
# 0부터 1까지 5개의 균등 분포된 숫자 생성
print(np.linspace(0, 1, 5))
# [0. 0.25 0.5 0.75 1. ]
# -10부터 10까지 7개의 균등 분포된 숫자 생성
print(np.linspace(-10, 10, 7))
# [-10. -6.67 -3.33 0. 3.33 6.67 10. ]
# 끝점 미포함
print(np.linspace(0, 1, 5, endpoint=False))
# [0. 0.2 0.4 0.6 0.8]
random.rand
random.rand는 numpy의 난수 생성 함수 중 하나로, 0과 1 사이의 균일 분포에서 무작위 샘플을 생성합니다.
random.rand 기본 사용법
np.random.rand(d0, d1, ..., dn)
d0 ... dn 은 배열의 차원을 나타냅니다.
random.rand 예제
import numpy as np
# 단일 난수 생성
print(np.random.rand())
# 예: 0.123456789
# 1차원 배열 생성 (5개의 난수)
print(np.random.rand(5))
# 예: [0.1234 0.5678 0.9012 0.3456 0.7890]
# 2차원 배열 생성 (3x3 행렬)
print(np.random.rand(3, 3))
# 예:
# [[0.1234 0.5678 0.9012]
# [0.3456 0.7890 0.2345]
# [0.6789 0.0123 0.4567]]
# 3차원 배열 생성 (2X3X4)
print(np.random.rand(2, 3, 4))
# 예:
# [[[0.49446624 0.84759521 0.68412378 0.88844044]
# [0.31811621 0.87179038 0.27574926 0.59982834]
# [0.29960921 0.98391579 0.48157951 0.44318515]]
#
# [[0.26888426 0.79309191 0.39731 0.28579173]
# [0.72812956 0.43485902 0.54383087 0.8918307 ]
# [0.34794511 0.53054308 0.77479999 0.95140259]]]