NumPy 位运算
2019-02-24 10:26:23
•
阅读
打赏
程序中的所有数在计算机内存中都是以二进制的形式储存的。
位运算就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。
如:6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。
NumPy "bitwise_" 开头的函数是位运算函数。
NumPy 位运算包括以下几个函数:
| 序号 | 操作及描述 |
|---|---|
| 1. | bitwise_and 对数组元素执行位与操作 |
| 2. | bitwise_or 对数组元素执行位或操作 |
| 3. | invert 计算位非 |
| 4. | left_shift 向左移动二进制表示的位 |
| 5. | right_shift 向右移动二进制表示的位 |
bitwise_and
通过 np.bitwise_and() 函数对输入数组中的整数的二进制表示的相应位执行位与运算。
import numpy as np
# 13 和 17 的二进制形式
a, b = 13, 17
print(bin(a), bin(b)) # 0b1101 0b10001
print('\n')
# 13 和 17 的位与
print(np.bitwise_and(13, 17)) # 1
位与真值表
| A | B | AND |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 0 |
| 1 | 1 | 0 | 1 | ||
|---|---|---|---|---|---|
| AND | |||||
| 1 | 0 | 0 | 0 | 1 | |
| result | 0 | 0 | 0 | 0 | 1 |
bitwise_or
通过 np.bitwise_or() 函数对输入数组中的整数的二进制表示的相应位执行位或运算。
import numpy as np
# 13 和 17 的二进制形式
a, b = 13, 17
print(bin(a), bin(b)) # 0b1101 0b10001
print('\n')
# 13 和 17 的位或
print(np.bitwise_or(13, 17)) # 29
位或真值表
| A | B | OR |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 0 | 0 | 0 |
| 1 | 1 | 0 | 1 | ||
|---|---|---|---|---|---|
| OR | |||||
| 1 | 0 | 0 | 0 | 1 | |
| result | 1 | 1 | 1 | 0 | 1 |
invert
invert() 函数对数组中整数进行位取反运算,即 0 变成 1,1 变成 0。
对于有符号整数,取该二进制数的补码,然后 +1。二进制数,最高位为0表示正数,最高位为 1 表示负数。
如 ~1 的计算步骤:
- 将1(这里叫:原码)转二进制 = 00000001
- 按位取反 = 11111110
- 发现符号位(即最高位)为1(表示负数),将除符号位之外的其他数字取反 = 10000001
- 末位加1取其补码 = 10000010
- 转换回十进制 = -2
import numpy as np
# 13 的位反转,其中 ndarray 的 dtype 是 uint8
print(np.invert(np.array([13], dtype=np.uint8))) # [242]
# 比较 13 和 242 的二进制表示,出现了位的反转
# 13 的二进制表示
print(np.binary_repr(13, width=8)) # 00001101
# 242 的二进制表示
print(np.binary_repr(242, width=8)) # 11110010
np.binary_repr()函数返回给定宽度中十进制数的二进制表示。
left_shift
numpy.left shift() 函数将数组元素的二进制表示中的位向左移动到指定位置,右侧附加相等数量的 0。
import numpy as np
print('将 10 左移两位:')
print(np.left_shift(10, 2))
print('10 的二进制表示:')
print(np.binary_repr(10, width=8))
print('40 的二进制表示:')
print(np.binary_repr(40, width=8))
# '00001010' 中的两位移动到了左边,并在右边添加了两个 0。
# 将 10 左移两位:
# 40
#
# 10 的二进制表示:
# 00001010
#
# 40 的二进制表示:
# 00101000
right_shift
numpy.right_shift() 函数将数组元素的二进制表示中的位向右移动到指定位置,左侧附加相等数量的 0。
import numpy as np
print('将 40 右移两位:')
print(np.right_shift(40, 2))
print('40 的二进制表示:')
print(np.binary_repr(40, width=8))
print('10 的二进制表示:')
print(np.binary_repr(10, width=8))
# '00001010' 中的两位移动到了右边,并在左边添加了两个 0
# 将 40 右移两位:
# 10
#
# 40 的二进制表示:
# 00101000
#
# 10 的二进制表示:
# 00001010

相关推荐
深度学习 -- 损失函数
深度残差网络(Deep Residual Networks (ResNets))
深度学习 -- 激活函数
神经网络训练 -- 调整学习速率
生成对抗网络(GAN)改进与发展
生成对抗网络(GAN)优点与缺点
生成对抗网络(GAN)的训练
生成对抗网络(GAN)基本原理
生成模型与判别模型