跳至內容

用戶: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 數學函數

[編輯 | 編輯原始碼]

使用「不完全由 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 的數學運算函數

[編輯 | 編輯原始碼]

除去上面的通用方法之外,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.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

隨機採樣

[編輯 | 編輯原始碼]

https://numpy.org/doc/stable/reference/random/index.html

統計:排序與計數

[編輯 | 編輯原始碼]

https://numpy.org/doc/stable/reference/routines.sort.html