第90天:NumPy 位运算与算术函数
by 潮汐
今天的文章和大家聊聊 Python Numpy 位运算和算术函数,本文将分两部分做详细描述。
Numpy 位运算
NumPy包中,可用位操作函数进行位运算,以 bitwise_
开头的函数是位运算函数。
NumPy 位运算函数如下:
函数 | 描述 |
---|---|
bitwise_and | 对数组元素执行位与运算 |
bitwise_or | 对数组元素执行位或运算 |
invert | 按位取反(位非运算) |
left_shift | 向左移动二进制表示的位(左移位) |
right_shift | 向右移动二进制表示的位(右移位) |
值得注意的是: 位运算同样可以使用操作符进行计算,分别是使用 "&"、 "~"、 "|" 和 "^" 等。
1、bitwise_and
bitwise_and() 函数对数组中整数的二进制形式执行位与运算。
实例:
a, b = 13, 17
print('13 和 17 的二进制:')
print(bin(a), bin(b))
print('\n')
print('13 和 17 的位与:')
print(np.bitwise_and(a,b))
输出结果:
13 和 17 的二进制:
0b1101 0b10001
13 和 17 的位与:
1
位与运算规律如下:
A | B | AND |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
13 和 17 的位与运算规律运算如下:
1 | 1 | 0 | 1 | ||
---|---|---|---|---|---|
1 | 0 | 0 | 0 | 1 | |
AND | |||||
0 | 0 | 0 | 0 | 1 |
所以 13 和 17 位与运算结果为 1
2、bitwise_or
bitwise_or()函数对数组中整数的二进制形式执行位或运算。
实例:
import numpy as np
# Numpy 位或运算
a, b = 13, 17
print('13 和 17 的二进制:')
print(bin(a), bin(b))
print('\n')
print('13 和 17 的位或:')
print(np.bitwise_or(a,b))
输出结果为:
13 和 17 的二进制形式:
0b1101 0b10001
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 | |
1 | 1 | 1 | 0 | 1 |
最后的运算结果为:
29
, 即数字 29 的二进制为 11101
,正是以上实例或运算结果。
3、invert
invert() 函数是对数值进行位非操作,位非即数值的取反操作。
invert() 函数对数组中整数进行位取反运算,即 0 变成 1,1 变成 0。
对于有符号整数,取该数二进制数的补码,然后 +1;二进制数最高位为0表示正数,最高位为 1 表示负数。
实例:
import numpy as np
# 比较 13 和 242 的二进制表示,发现了位的反转
print('13 的二进制表示:')
print(np.binary_repr(13, width=8))
print('\n')
print('242 的二进制表示:')
print(np.binary_repr(242, width=8))
print('13 的位反转:')
print(np.invert(np.array([13], dtype=np.uint8)))
print('\n')
输出结果为:
13 的二进制表示:
00001101
242 的二进制表示:
11110010
13 的位反转:
[242]
4、left_shift
left_shift() 函数将数组元素的二进制形式向左移动到指定位置,右侧附加相等数量的 0。
实例:
import numpy as np
print('将 10 左移两位:')
print(np.left_shift(10, 2))
print('\n')
print('10 的二进制表示:')
print(np.binary_repr(10, width=8))
print('\n')
print('40 的二进制表示:')
print(np.binary_repr(40, width=8))
# '00001010' 中的两位移动到了左边,并在右边添加了两个 0。
输出结果为:
将 10 左移两位:
40
10 的二进制表示:
00001010
40 的二进制表示:
00101000
5、right_shift
right_shift() 函数将数组元素的二进制形式向右移动到指定位置,左侧附加相等数量的 0。
import numpy as np
print('将 40 右移两位:')
print(np.right_shift(40, 2))
print('\n')
print('40 的二进制表示:')
print(np.binary_repr(40, width=8))
print('\n')
print('10 的二进制表示:')
print(np.binary_repr(10, width=8))
# '00001010' 中的两位移动到了右边,并在左边添加了两个 0。
输出结果为:
将 40 右移两位:
10
40 的二进制表示:
00101000
10 的二进制表示:
00001010
Numpy 算术函数
1、介绍及函数明细
Numpy 算术函数-->算术函数顾名思义就是加、减、乘、除的意思,即add(),subtract(),multiply() 和 divide()等。
但值得注意的是数组必须具有相同的形状或符合数组广播规则。
NumPy 中涵盖的算术运算通过下表展示,除了基本的算术运算函数外,下表中还列出对应的指数和对数函数,详细信息如下:
方法 | 描述 |
---|---|
add() | 按元素添加参数 |
subtract() | 从元素方面减去参数 |
multiply() | 在元素方面乘以论证 |
divide() | 以元素方式返回输入的真正除法 |
logaddexp() | 输入的取幂之和的对数 |
logaddexp2() | base-2中输入的取幂之和的对数 |
true_divide() | 以元素方式返回输入的真正除法 |
floor_divide() | 返回小于或等于输入除法的最大整数 |
negative() | 数字否定, 元素方面 |
positive() | 数字正面, 元素方面 |
power() | 第一个数组元素从第二个数组提升到幂, 逐个元素 |
remainder() | 返回除法元素的余数 |
mod() | 返回除法元素的余数 |
fmod() | 返回除法的元素余数 |
divmod() | 同时返回逐元素的商和余数 |
absolute() | 逐个元素地计算绝对值 |
fabs() | 以元素方式计算绝对值 |
rint() | 将数组的元素舍入为最接近的整数 |
sign() | 返回数字符号的元素指示 |
heaviside() | 计算Heaviside阶跃函数 |
conj() | 以元素方式返回复共轭 |
conjugate() | 以元素方式返回复共轭 |
exp() | 计算输入数组中所有元素的指数 |
exp2() | 计算输入数组中所有 p 的 2**p |
log() | 自然对数, 元素方面 |
log2() | x的基数为2的对数 |
log10() | 以元素方式返回输入数组的基数10对数 |
expm1() | 计算数组中的所有元素吗,exp(x) - 1 |
log1p() | 返回一个加上输入数组的自然对数, 逐个元素 |
sqrt() | 以元素方式返回数组的非负平方根 |
square() | 返回输入的元素方块 |
cbrt() | 以元素方式返回数组的立方根 |
reciprocal() | 以元素方式返回参数的倒数 |
gcd() | 返回最大公约数 |
lcm() | 返回 最小公倍数 |
2、实例详解
2.1、add()
add() 表示两个数组相加,add() 函数使用方法如下:
add(数组1,数组2,…)
实例:
import numpy as np
a = np.arange(16, dtype = np.int_).reshape(4,4)
print('第一个数组:')
print(a)
print('\n')
print('第二个数组:')
b = np.array([10, 10, 10, 10])
print(b)
print('\n')
# 两个数组相加
print('两个数组相加:')
print(np.add(a, b))
print('\n')
以上结果输出为:
第一个数组:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
第二个数组:
[10 10 10 10]
两个数组相加:
[[10 11 12 13]
[14 15 16 17]
[18 19 20 21]
[22 23 24 25]]
由上可得结论,数组之间的相加维度、数据类型必须一致。
2.2、subtract()
subtract()表示两个数组相减,subtract() 函数使用方法如下:
subtract(数组1,数组2,…)
实例:
import numpy as np
a = np.arange(16, dtype = np.int_).reshape(4,4)
print('第一个数组:')
print(a)
print('\n')
print('第二个数组:')
b = np.array([10, 10, 10, 10])
print(b)
print('\n')
print('两个数组相减:')
print(np.subtract(a, b))
print('\n')
以上结果输出为:
第一个数组:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
第二个数组:
[10 10 10 10]
两个数组相减:
[[-10 -9 -8 -7]
[ -6 -5 -4 -3]
[ -2 -1 0 1]
[ 2 3 4 5]]
2.3、multiply()
multiply() 表示两个数组相乘,multiply() 函数使用方法:multiply(数组1,数组2,…)
实例:
import numpy as np
a = np.arange(16, dtype = np.int_).reshape(4,4)
print('第一个数组:')
print(a)
print('\n')
print('第二个数组:')
b = np.array([10, 10, 10, 10])
print(b)
print('\n')
print('两个数组相乘:')
print(np.multiply(a, b))
print('\n')
输出结果为:
第一个数组:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
第二个数组:
[10 10 10 10]
两个数组相乘:
[[ 0 10 20 30]
[ 40 50 60 70]
[ 80 90 100 110]
[120 130 140 150]]
2.4、divide()
divide() 表示两个数组相除,divide() 使用方法为:divide(数组1,数组2,…)
实例:
import numpy as np
a = np.arange(16, dtype = np.int_).reshape(4,4)
print('第一个数组:')
print(a)
print('\n')
print('第二个数组:')
b = np.array([10, 10, 10, 10])
print(b)
print('\n')
print('两个数组相除:')
print(np.divide(a, b))
输出结果为:
第一个数组:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
第二个数组:
[10 10 10 10]
两个数组相除:
[[0. 0.1 0.2 0.3]
[0.4 0.5 0.6 0.7]
[0.8 0.9 1. 1.1]
[1.2 1.3 1.4 1.5]]
2.5 log()
log() 函数是取数的对数
实例:
import numpy as np
# 数的对数测试
c = 100
print('数字100的对数:')
print(np.log(c))
输出结果为:
数字100的对数:
4.605170185988092
2.6 numpy.power()
numpy.power() 函数将第一个输入数组中的元素作为底数,计算它与第二个输入数组中相应元素的幂。
实例:
# NumPy 幂计算
import numpy as np
d = np.array([2, 5, 10])
print('第一个数组是:')
print(d)
print('\n')
print('调用 power 函数:')
print(np.power(d, 2))
print('\n')
print('第二个数组:')
e = np.array([1, 2, 3])
print(e)
print('\n')
print('再次调用 power 函数:')
print(np.power(d, e))
输出结果为:
第一个数组是:
[ 2 5 10]
调用 power 函数:
[ 4 25 100]
第二个数组:
[1 2 3]
再次调用 power 函数:
[ 2 25 1000]
总结
本章节是 NumPy 位运算和算术函数运用的基本介绍,这部分的知识实例都是从简单入手,对于一个知识点,难的是综合运用,只有根基牢固才能造出大 House,希望对使用这部分知识的工程师提供更好的支撑。
参考
https://www.runoob.com/numpy/numpy-arithmetic-operations.html
https://www.numpy.org.cn/reference/ufuncs.html
https://numpy.org/devdocs/reference/routines.math.html
文中示例代码:python-100-days
关注公众号:python技术,回复"python"一起学习交流
作者:纯洁的微笑
出处:www.ityouknow.com
资源:微信搜【纯洁的微笑】关注我,回复 【程序员】【面试】【架构师】有我准备的一线程序必备计算机书籍、大厂面试资料和免费电子书。 一共1024G的资料,希望可以帮助大家提升技术和能力。
点我了解:Cxy521-程序员一站式导航网站