用戶:Xyy23330121/Python/科學計算/數組的運算
本章節將詳細講述數組支持的數學運算。本章節的代碼均以下面代碼開頭。
import numpy as np
當數組和數字進行運算時,相當於數組中每個分量都與該數字進行運算,再將運算結果重新組合成一個數組。比如:
a = np.array([[1,2,3,4],[5,6,7,8]])
b = a + 2
c = a * 2
d = a % 2
e = a ** 2
f = a < 2
print(a,b,c,d,e,f,sep="\n")
以上代碼輸出為:
[[1 2 3 4]
[5 6 7 8]]
[[ 3 4 5 6]
[ 7 8 9 10]]
[[ 2 4 6 8]
[10 12 14 16]]
[[1 0 1 0]
[1 0 1 0]]
[[ 1 4 9 16]
[25 36 49 64]]
[[ True False False False]
[False False False False]]
數組只能與具有相同 shape 屬性的數組進行運算。在運算時,相當於相同位置分量之間進行運算,比如:
a = np.array([[1,2,3,4],[5,6,7,8]])
b = np.array([[1,1,2,2],[1,1,2,2]])
print(a + b)
print(a - b)
print(a * b)
print(a % b)
print(a ** b)
print(a > 3*b)
以上代碼輸出為:
[[ 2 3 5 6]
[ 6 7 9 10]]
[[0 1 1 2]
[4 5 5 6]]
[[ 1 2 6 8]
[ 5 6 14 16]]
[[0 0 1 0]
[0 0 1 0]]
[[ 1 2 9 16]
[ 5 6 49 64]]
[[False False False False]
[ True True True True]]
使用「不完全由 Python 運算符構成」的函數處理數組時,很可能出現錯誤。比如:
import math
a = np.array([[1,2,3,4],[5,6,7,8]])
print(math.sin(a)) #TypeError
這裏之所以會報錯,是因為 Python 的 math 模塊使用的並非 Python 內部的數學計算,而是將傳入的參數轉化為浮點數,然後使用預先編譯好的可執行文件,由可執行文件內部進行數學計算並返回結果。中間這個傳遞參數的過程不支持 numpy 的會導致錯誤。
對於數學函數,一個通用的辦法是類比之前章節任意維度列表複製的內容:
import math
def calculate(array, func):
return np.array([
(calculate(obj, func) if isinstance(obj, np.ndarray) else func(obj))
for obj in array])
a = np.array([[1,2,3,4],[5,6,7,8]])
print(calculate(a, math.sin))
此時會輸出正常的結果。需要注意的是,在 numpy 中,數組的類型是 numpy.ndarray 而非 np.array,因此上面的 calculate 函數在判定類型時,使用了 np.ndarray 來判定,而不是使用 np.array 來判定。
除去上面的通用方法之外,numpy 模塊中有許多 Python 數學函數的「numpy 版本」。numpy 版本的數學函數支持直接輸入數組進行操作。比如上面的運算,如果使用 numpy 的數學函數,則可以簡化成:
a = np.array([[1,2,3,4],[5,6,7,8]])
print(np.sin(a))
具體數學函數列表可以參見 numpy數學函數 子頁面。或者查詢下面的文檔:
- https://numpy.org/doc/stable/reference/routines.emath.html
- https://numpy.org/doc/stable/reference/routines.math.html
https://numpy.org/doc/stable/reference/routines.bitwise.html
https://numpy.org/doc/stable/reference/routines.bitwise.html
https://numpy.org/doc/stable/reference/arrays.ndarray.html#calculation
https://numpy.org/doc/stable/reference/routines.polynomials.html