NumPy位运算

11个月前 (04-27)
本节重点讲解 NumPy 的位运算,NumPy 中提供了以下按位运算函数:

numpy按位运算函数

序号

函数

位运算符

描述说明

1

bitwise_and

&

计算数组元素之间的按位与运算。

2

bitwise_or

|

计算数组元素之间的按位或运算。

3

invert

~

计算数组元素之间的按位取反运算。

4

left_shift

<<

将二进制数的位数向左移。

5

right_shift

>>

将二进制数的位数向右移。

bitwise_and()

该函数对数组中整数的二进制数进行“按位与”运算。示例如下:

import numpy as np

a = 10

b = 12

print("a的二进制数:",bin(a))

print("b的二进制数:",bin(b))

print("将a与b执行按位与操作:",np.bitwise_and(a,b))


输出结果如下:

a的二进制: 0b1010

b的二进制: 0b1100

a与b执行按位与操作: 8

如果两个的二进制数相对应的位都为 1,那么执行位与运算后,该位的结果就为 1,否则就为 0。上述示例:a 与 b 位与运算的结果为 1000,因此它的十进制结果为 8。

位与运算的真值表,如下所示:

位与运算真值表

A

B

AND(A,B)

0

0

0

0

1

0

1

0

0

1

1

1

bitwise_or()

bitwise_or() 对数组中整数的二进制数执行“按位或”运算。示例如下:

import numpy as np

a,b = 13,17

print ('13 和 17 的二进制数:')

print (bin(a), bin(b))

print ('13 和 17 的位或:')

print (np.bitwise_or(13, 17))

输出结果:

13 和 17 的二进制数:

0b1101 0b10001

13 和 17 的位或:

29

对于按位或运算,只要相对应的二进制位上有一个为 1,那么它的运算结果就位 1,否则为 0,其真值表如下:

位或运算真值表

A

B

OR(A,B)

0

0

0

0

1

1

1

0

1

1

1

1

Invert()

该方法对数组中整数做按位取反运算,也就是 0 变成 1,1 变为 0。若是有符号的负整数,取其二进制数的补码,并执行 +1 操作。

对于有符号二进制数,其最高位为 0, 表示正数;最高位为 1, 表示负数。

下面通过一组示例,对取反运算进行说明:

import numpy as np

#数据类型为无符号整型uint8

arr = np.array([20],dtype = np.uint8)

print("二进制表示:",np.binary_repr(20,8))

print(np.invert(arr))

#进行取反操作

print("二进制表示: ", np.binary_repr(235,8))

输出结果如下:

二进制表示:00010100

[235]

二进制表示:11101011

注意:上述示例中,np.binary_repr 函数用来设置二进制数的位数。若对补码概念不熟悉,可参考百度百科《补码》。

left_shift()

该方法把数组元素的二进制数向左移动到指定位置,而其返回值所对应的二进制数,则会从右侧追加相等数量的 0(移动了多少位便追加多少个0)。

示例如下:

import numpy as np

#移动三位后的输出值

print (np.left_shift(20,3)

#打印移动后20的二进制数

print (np.binary_repr(20, width = 8))

#函数返回值的二进制数

print (np.binary_repr(160, width = 8))

输出结果为:

移动三位后的返回值:

160

移动三位后20的二进制数:

00010100

函数返回值的二进制数:

10100000

right_shift()

right_shift() 将数组中元素的二进制数向右移动到指定位置,其返回值对应的二进制数会从左侧追加相等数量的 0。该函数使用与 left_shift() 恰好相反。

示例如下:

import numpy as np

#将40右移两位后返回值:

print (np.right_shift(40,2))

#移动后40的二进制数:

print (np.binary_repr(40, width = 8))

#移动后返回值的二进制数:

print (np.binary_repr(10, width = 8))

输出结果为:

将40右移两位后返回值:

10

移动后40的二进制数:

00101000

移动后返回值的二进制数:

00001010