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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章