Pynote

Python、機械学習、画像処理について

numpy -ビット演算

numpy.bitwise_and

ビットごとの論理積を計算する。

関数

numpy.bitwise_and(x1, x2)

print(np.bitwise_and(16, 18))  # 16

# 2進表記
print('(16)_2', np.binary_repr(16))  # 0b10000
print('(18)_2', np.binary_repr(18))  # 0b10010
print('(16 & 18)_2', np.binary_repr(16 & 18))  # 0b10000

numpy.bitwise_or

ビットごとの論理和を計算する。

関数

numpy.bitwise_or(x1, x2)

print(np.bitwise_or(11, 20))  # 31

# 2進表記
print('(11)_2', np.binary_repr(11))  # 0b1011
print('(20)_2', np.binary_repr(20))  # 0b10100
print('(16 & 18)_2', np.binary_repr(11 | 20))  # 0b11111

numpy.bitwise_xor

ビットごとの排他的論理和を計算する。

関数

numpy.bitwise_xor(x1, x2)

print(np.bitwise_xor(11, 19))  # 24

# 2進表記
print('(11)_2', np.binary_repr(11))  # 1011
print('(20)_2', np.binary_repr(19))  # 10011
print('(16 & 18)_2', np.binary_repr(11 ^ 19))  # 11000

numpy.invert

ビットを反転させる。
numpy.invert() と numpy.bitwise_not() は同じ。

関数

numpy.invert(x)
numpy.bitwise_not(x)

print(np.invert(11))  # -12
print(np.bitwise_not(11))  # -12

# 2進表記
print('(11)_2', np.binary_repr(11))  # 1011
print('(16 & 18)_2', np.binary_repr(~11))  # -1100

numpy.left_shift

ビットを左シフトする。

関数

numpy.left_shift(x1, x2)

print(np.left_shift(11, 2))  # 44

# 2進表記
print('(11)_2', np.binary_repr(11))  # 1011
print('(16 & 18)_2', np.binary_repr(11 << 2))  # 101100

numpy.right_shift

ビットを右シフトする。

関数

numpy.right_shift(x1, x2)

print(np.right_shift(11, 2))  # 2

# 2進表記
print('(11)_2', np.binary_repr(11))  # 1011
print('(16 & 18)_2', np.binary_repr(11 >> 2))  # 10

numpy.unpackbits

np.uint8 型の配列の各要素を値を8個の0/1からなるビット表現に置き換える。
例えば、4という値は 0 0 0 0 0 1 0 0 に置き換えられる。

関数

numpy.unpackbits(myarray, axis=None)

例 axis を指定しない場合

a = np.array([[2],
              [7],
              [23]], dtype=np.uint8)  # a.shape=(3, 1)
print(np.unpackbits(a))
# [0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1]

例 axis を指定した場合

a = np.array([[2],
              [7],
              [23]], dtype=np.uint8)  # a.shape=(3, 1)
print(np.unpackbits(a, axis=1))
# [[0 0 0 0 0 0 1 0]
#  [0 0 0 0 0 1 1 1]
#  [0 0 0 1 0 1 1 1]]

numpy.packbits

ビット表現を値に変換する。

関数

numpy.packbits(myarray, axis=None)

例 axis を指定しない場合

a = np.array([[0, 0, 0, 0, 0, 0, 1, 0],
              [0, 0, 0, 0, 0, 1, 1, 1],
              [0, 0, 0, 1, 0, 1, 1, 1]],
             dtype=np.uint8)
print(np.packbits(a))  # [ 2  7 23]

例 axis を指定した場合

a = np.array([[0, 0, 0, 0, 0, 0, 1, 0],
              [0, 0, 0, 0, 0, 1, 1, 1],
              [0, 0, 0, 1, 0, 1, 1, 1]],
             dtype=np.uint8)
print(np.packbits(a, axis=1))
# [[ 2]
#  [ 7]
#  [23]]

numpy.binary_repr

値をビット表現の文字列に変換する。
width を指定した場合、ビット表現した際の長さが width 未満の場合は0パディングされる。

関数

numpy.binary_repr(num, width=None)

print(np.binary_repr(17))  # 10001

# width=8 になるよう0パディングされる。
print(np.binary_repr(17, width=8))  # 00010001