Python/Numpy

[Numpy] np.ones, ones_like, zeros, zeros_like 정리 + full, empty

jimmy_AI 2022. 1. 5. 14:27
반응형

파이썬 넘파이 배열 값 채우기 함수 비교

안녕하세요. 이번 글에서는 파이썬 넘파이에서 배열에 특정 값들을

채우는 함수들인 np.ones, np.zeros, np.ones_like, np.zeros_like의

사용법을 비교해보고, np.full과 np.zeros 함수도 살펴보겠습니다.

 

np.ones, np.zeros : 1 혹은 0으로 배열 채우기

np.ones와 np.zeros 내에 array의 shape을 입력해주면,

해당 크기에 맞추어 1 혹은 0으로 모든 값이 채워집니다.

import numpy as np

np.zeros(5) # array([0., 0., 0., 0., 0.])

np.zeros((2, 3))
# 결과
array([[0., 0., 0.],
       [0., 0., 0.]])

np.ones((2, 2, 2))
# 결과
array([[[1., 1.],
        [1., 1.]],

       [[1., 1.],
        [1., 1.]]])

(2, 3), (2, 2, 2) 처럼 shape을 지정할 튜플을 input으로 넣어주시면 됩니다.

 

 

np.ones_like vs np.ones (np.zeros_like vs np.zeros)

_like로 끝나는 형태의 함수들도 넘파이 라이브러리에서 지원합니다.

 

np.onesnp.ones_like의 차이는 shape을 직접 input으로 넣어주느냐 아니면

특정 shape을 가진 array를 넣어주느냐의 차이입니다.

 

np.zeros와 np.zeros_like의 차이도 위의 경우와 마찬가지라고 보실 수 있으며,

뒤에서 설명할 empty, full의 like 함수도 같은 원리가 적용됩니다.

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

# shape 대신 array를 input
np.zeros_like(a) # array([0, 0, 0, 0, 0])

np.ones_like(b)
# 결과
array([[1, 1, 1],
       [1, 1, 1]])

shape을 지정할 tuple이 아니라 array a, b가 직접 input으로 들어간 것

확인해보실 수 있습니다.

반응형

np.full, np.empty : 특정 값 혹은 메모리 내 값으로 배열 채우기

np.ones, np.zeros 함수와 같은 원리로 동작하는 np.full, np.empty 함수도 있습니다.

 

np.full 함수는 shape과 채울 값 2가지를 input으로 지정해주시면,

지정한 값으로 해당 shape만큼 값이 채워진 array를 반환해줍니다.

 

np.empty 함수는 shape를 지정해주면 메모리 내 임의 값들을 받아

흔히 말하는 쓰레기 값으로 값이 채워진 array를 반환해줍니다.

원하는 조건의 random 초기화를 원하는 경우는 이 함수를 절대 사용하지 말고,

np.random 모듈의 함수를 사용해야합니다.

 

이 두 함수도 full_like, empty_like 형태의 사용도 가능합니다.

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

np.full(6, 2.5) # array([2.5, 2.5, 2.5, 2.5, 2.5, 2.5])

np.full((3, 2), -4)
# 결과
array([[-4, -4],
       [-4, -4],
       [-4, -4]])

np.empty(3) # array([0.75, 0.75, 0.  ]) -> 실행마다 달라짐

np.full_like(a, 3) # array([3, 3, 3, 3, 3])

np.empty_like(b)
# 결과(실행마다 달라짐)
array([[4612811918334230528, 4612811918334230528, 4612811918334230528],
       [4612811918334230528, 4612811918334230528, 4612811918334230528]])

추가로, 해당 함수들에서 dtype인자로 np.float32, np.float64, np.int32, np.int64 등

자료형을 지정하는 것이 가능하니, 사용에 참고하시면 좋을 듯 합니다.

np.full_like(a, 3.3, dtype = np.float64)
#array([3.3, 3.3, 3.3, 3.3, 3.3])

np.full_like(a, 3.3, dtype = np.int32)
#array([3, 3, 3, 3, 3])