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"一起學習交流