안녕하세요. 지난 포스팅의 넘파이 알고 쓰자 - Elementwise bit operations에 이어서 오늘은 다루지 못한 Bit packing과 output formatting에 대해서 다루도록 하겠습니다.
1. numpy.binary_repr(num, width=None)
이 함수는 십진수를 이진수로 변환하여 출력하는 아주 간단한 함수입니다. num에는 변환할 십진수가 들어가고 width에는 몇 비트로 표현할 것인지 적어주면 됩니다.
np.binary_repr(3) # '11'
np.binary_repr(3, width=3) # '011'
np.binary_repr(3, width=4) # '0011'
np.binary_repr(3, width=5) # '00011'
이와 같이 width를 바꾸게 되면 전체 비트의 개수가 변하는 것을 볼 수 있습니다.
2. numpy.packbits(a, axis=None)
이 함수는 넘파이 배열의 원소별로 이진수를 np.uint16의 십진수로 변환하는 함수입니다. a에는 변환할 함수, axis에는 어떤 축을 중심으로 변환할 것인지를 넣어주면 됩니다. 이때, axis는 최대 ndim - 1까지 올 수 있습니다. 간단한 예제를 보도록 하겠습니다.
a = np.array([[1,0,1],
[0,1,0]])
np.packbits(a, axis=0)
# array([[128, 64, 128]], dtype=uint8)
np.packbits(a, axis=1)
# array([[160],
# [ 64]], dtype=uint8)
첫번째 결과에서는 a 배열을 axis = 0 방향으로 packing 하는 것입니다. 따라서, (0, 0)에는 '1000 0000'을 packing하기 때문에 128, (0, 1)에는 '0100 0000'을 packing하기 때문에 64, (0, 2)에서는 '1000 0000'을 packing하기 때문에 128이 됩니다. 나머지 원소들도 동일하게 적용하면 되겠죠?
두번째 결과에서는 a 배열을 axis = 1 방향으로 packing 하는 것입니다. 따라서, (0, 0)에는 '1010 0000'을 packing하기 때문에 160, (0, 1)에는 '0100 0000'을 packing하기 때문에 64가 나오게 됩니다.
3. numpy.unpackbits(a, axis=None, count)
이 함수는 packbits 함수의 반대입니다. 즉, 십진수를 이진수로 다시 변환하는 함수이죠. 다른 점은 count라는 인자가 있다는 것인데, 이것은 예제를 보도록 하겠습니다.
b = np.array([[128, 64, 128]], dtype=np.uint8)
np.unpackbits(b, axis=0, count=1)
# array([[1, 0, 1]], dtype=uint8)
np.unpackbits(b, axis=0, count=2)
# array([[1, 0, 1],
# [0, 1, 0]], dtype=uint8)
np.unpackbits(b, axis=0, count=3)
# array([[1, 0, 1],
# [0, 1, 0],
# [0, 0, 0]], dtype=uint8)
np.unpackbits(b, axis=0, count=4)
# array([[1, 0, 1],
# [0, 1, 0],
# [0, 0, 0],
# [0, 0, 0]], dtype=uint8)
결과를 보시면 count라는 함수에 의해서 행 방향으로 점점 '000' 이 늘어나는 것을 볼 수 있습니다. 즉, count는 간단하게 padding의 의미를 부여한다고 보시면 될 거 같습니다.
'Programming > Python' 카테고리의 다른 글
넘파이 알고 쓰자 - 문자열 연산 2 (0) | 2020.10.04 |
---|---|
넘파이 알고 쓰자 - 문자열 연산 1 (0) | 2020.09.14 |
넘파이 알고 쓰자 - Elementwise bit operations (0) | 2020.09.08 |
넘파이 알고 쓰자 - 넘파이 원소 재배열하기 (0) | 2020.09.03 |
넘파이 알고 쓰자 - 넘파이의 원소 제거 및 추가(delete, add) (0) | 2020.09.01 |