Numpy

  • Numpy는 파이썬으로 데이터를 분석할 때 가장 많이 사용하는 모듈 중 하나이다. Numpy의 자료형은 ndarray효율적인 배열 연산을 하기 위해 개발되었다.
  • 리스트와 ndarray는 유연성과 효율성 측면에서 비교할 수 있다. 파이썬 리스트의 경우, 서로 다른 자료형을 담을 수 있어 유연성이 높은 반면 각 요소의 정보를 따로 담아야 하기 때문에 반복문 사용이 필수적이라 효율성이 떨어진다. ndarray의 경우 같은 자료형만을 이용해 구성할 수 있어 유연성은 떨어지지만 모든 요소 정보를 한 번에 저장하고 C로 구현된 내부 반복문을 사용하기 때문에 속도가 매우 빠르다.

 

배열 만들기 : np.array()

리스트를 활용해 배열을 만들 수 있다. 이 외에, array() 함수의 인자로 리스트, 튜플, ndarray, mat와 같은 array-like 객체들을 전달해 배열을 만들 수도 있다.

import numpy as np
a = np,array([1, 4, 2, 5, 3])
b = np.array([3.14, 4, 2, 3])
c = np.array([1, 2, 3, 4], dtype=float)
d = np.array([4, 2, 3, 3.14])
print(a, b, c, d)

a # array([1, 4, 2, 5, 3]) → int
b # array([3.14, 4.  , 2.  , 3.  ]) → float
c # array([1., 2., 3., 4.]) → float
d # array([4.  , 2.  , 3.  , 3.14]) → float

np.array()로 만들어진 ndarray 객체들은 array()로 표현된다. ndarray는 같은 자료형만으로 구성되므로, b나 c처럼 float와 int가 같이 들어오게 된다면 해당 ndarray의 객체의 자료형은 보다 큰 자료형인 float로 정의된다.

★ 주의
np.array의 함수의 인자로 스칼라 형태의 값을 전달해줄 수 있다. 이때, ndarray는 0차원이되며, 모양은 (), 크기는 1이 된다. 해당 스칼라를 리스트의 형태로 값을 전달해줄 경우, ndarray는 1차원이되며, 모양은 (1, ), 크기는 1이 된다. 즉 단순히 스칼라를 인자로 전달하는 것과, 리스트로 인자를 전달하는 것은 엄격히 구별되어야 한다.

# array에서는 스칼라를 전달할 수도 있다.
e = np.array(10)
e # array(10)

# 이때, 배열은 0차 배열이 된다. 이 배열의 차원과 모양, 크기는 다음과 같다.
e.ndim # 0
e.shape # ()
e.size # 1

# 1차 배열을 생성하려면 다음과 같이 리스트, 혹은 튜플의 형태로 넘겨야 한다.
e = np.array([10])
e # array([10])

e.ndim # 1
e.shape # (1,)
e.size # 1

 


특정 수로 채워진 배열 만들기 : zeros(), ones(), full()

1. np.zeros(shape) : shape의 모양을 가지면서 0으로 채워진 ndarray 생성

# shape가 int일 경우 벡터(배열), tuple일 경우 배열이 된다.
a = np.zeros(10, dtype = int) # 0으로 채워진 크기가 10인 벡터
a = np.zeros((10, 2), dtype = float) 
# 0. 으로 채워진 크기가 (10, 2)인 행렬

2. np.ones(shape) : shape의 모양을 가지면서 1로 채워진 ndarray 생성

# zeros()와 비슷하지만 0 대신 1로 채워져 있다는 것이 다르다
b = np.ones((3, 5), dtype = float) 
# 1. 로 체워진 크기가 (3, 5)인 행렬

3. np.full(shape, x) : shape의 모양을 가지면서 x로 채워진 ndarray 생성

# zeros, ones와 비슷하지만 이번엔 x 값으로 채워져 있다는 것이 다르다.
c = np.full((3, 5), 3.14) 
# 3.14로 채워진 크기가 (3, 5)인 행렬

 

범위를 지정하여 배열 만들기 : np.arange(), np.linspace()

4. np.arange(start, stop, step) : range 함수와 동일하게 작동하면서 ndarray를 반환한다. start부터 stop까지, step만큼 건너뛴 값으로 이루어진 ndarray를 반환한다. 

# 4-1. start의 default 값은 0, step의 default 값은 1이다.
# 4-2. 값이 하나 주어지면 stop을 초기화 한다.
# 4-3. 값이 두 개 주어지면 start, stop을 초기화 한다.
# ★ step의 값이 정수가 아닌 경우 값이 항상 일정하지 않을 수 있으므로, 이때는 numpy.linspace를 사용하는 것이 더 좋다.
d = np.arange(0, 20, 2) # array([0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
# 0에서 2씩 더해 20까지 채우는 배열 생성 (20은 stop이므로 포함 안됨)

5. np.linspace(start, stop, num) : arange와는 다르게, start부터 stop까지 num만큼의 요소를 가지는 등간격의 ndarray를 반환한다. arange와의 차이점이라고 하면 linspace는 start, stop 모두 포함한다.

e = np.linspace(0, 1, 5) # array([0., 0.25, 0.5, 0.75, 1.])
# 0과 1사이에 일정한 간격을 가진 5개의 값으로 채운 배열을 만든다. (0, 1 둘 다 포함)

 

다양한 함수로 배열 만들기 : np.random, np.eye()

6. np.random 모듈의 다양한 함수를 이용하여 ndarray내 요소들을 랜덤하게 채울 수 있다.

# 6-1. np.random.random(size) : size크기의 0과 1사이의 난수를 생성
f = np.random.random((3,3)) # 3*3 크기의 난수 배열 생성

# 6-2. np.random.normal(loc, scale, size) : size 크기의 평균이 loc, 표준 편차가 scale인 가우시안 정규분포 생성
g = np.random.normal(0, 1, (3, 3)) # 평균 0, 표준 편차 1의 정규 분포를 따르는 3*3 난수 배열

# 6-3. np.random.randint(low, high, size) : [low, high) 사이의 임의의 정수를 이용해 size 크기의 배열 생성
h = np.random.randint(0, 10, (3, 3)) # [0, 10) 구간의 임의로 정수로 채운 3*3 배열 만들기

7. np.eye(x) : 크기가 x인 단위행렬을 만든다.

i = np.eye(3) # 크기 3의 단위 행렬 만들기
728x90
반응형

'데이터 분석 & 시각화 > Numpy' 카테고리의 다른 글

Numpy 연산과 Broadcasting  (0) 2021.02.16
Numpy 인덱싱과 슬라이싱  (0) 2021.01.12
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기