Python科學計算包NumPy教程
阿新 • • 發佈:2020-07-16
在我的Github上有一份程式碼與教程結合的jupyter Notebook檔案,大家可以clone下來看一看。
下面會用例項的方式給出一些examples:
Tutorial教程
官方中文文件
import numpy as np # 建立陣列: array1 = np.array([1, 2, 3]) # 建立一個一維陣列,只有一個軸,軸的長度為3 print(array1) # 通過列表建立二維陣列: print(np.array([(1, 2, 3), (4, 5, 6)])) # 2x3的陣列 # 建立全為0的二維陣列: print(np.zeros((3, 3))) # 3x3的零矩陣 # 建立全為1的三維矩陣: print(np.ones((2, 3, 4))) # 2x3x4的元素全為1的矩陣 # 建立一維等差陣列: print(np.arange(10)) # 建立二維等差陣列: print(np.arange(6).reshape(2, 3)) # 建立2x3的等差陣列 # 建立單位矩陣(二維陣列): print(np.eye(3)) # 建立間隔一維陣列: print(np.linspace(1, 10, num = 6)) # 建立二維隨機陣列 print(np.random.rand(2, 3)) # 建立二維隨機整數陣列(數值小於5) print(np.random.randint(5, size = (2, 3))) # 依據自定義函式建立陣列(lambda表示式): print(np.fromfunction(lambda x, y: x + y, (3, 3))) # 生成一維陣列a, b後進行陣列運算: a = np.array([10, 20, 30, 40, 50]) b = np.arange(1, 6) print(a) print(b) # add加法運算: print(a + b) # sub減法運算: print(a - b) # Multiply乘法運算: print(a * b) # divide除法運算: print(a / b) print('以上操作均在一維陣列上進行') # 生成二維陣列A, B進行陣列運算: A = np.array([[1, 2], [3, 4]]) B = np.array([[5, 6], [7, 8]]) print(A) print(B) # add: print(A + B) # sub: print(A - B) # multiply矩陣元素之間的乘法: print(A * B) # 矩陣乘法運算: print(np.dot(A, B)) # 或者將A, B轉為matrix矩陣再直接相乘 print(np.mat(A) * np.mat(B)) # 數乘矩陣: print(20 * A) # 矩陣的轉置: print(A.T) # 矩陣求逆: print(np.linalg.inv(A)) print('以上操作均在二維陣列或矩陣中進行') # 數學函式 print('Math Function example') # 三角函式: print(a) print(np.sin(a)) # 以自然對數為底的指數函式e^x: print(np.exp(a)) # 陣列的開平方根 print(np.sqrt(a)) # 陣列的切片 and 索引 print('Array split & index') # 一維陣列index a = np.array([1, 2, 3, 4, 5]) print(a[0]) print(a[-3]) # 一維陣列split print(a[0: 2]) print(a[: -1]) # 二維陣列index: a = np.array([(1, 2, 3), (4, 5, 6), (7, 8, 9)]) print(a[0]) print(a[-1]) # 二維陣列split: print(a[:, -1]) # 二維陣列切片需要用,區分行列這裡是最後一列的意思 # 陣列外形操作: print('Array Shape') # 檢視陣列形狀: a = np.random.random((3, 2)) print(a) print(a.shape) # 更改陣列形狀(不改變原始陣列的形狀): print(a.reshape(2, 3)) print(a) # 更改陣列形狀(改變原始陣列的形狀) print(a.resize(2, 3)) print(a) # 展平陣列 將多維陣列轉換為一維陣列 print(a.ravel()) # 垂直合併陣列 a = np.random.randint(10, size = (3, 3)) b = np.random.randint(10, size = (3, 3)) print(a) print(b) print(np.vstack((a, b))) # 水平合併陣列: print(np.hstack((a, b))) # 沿x軸切分陣列: print(np.vsplit(a, 3)) # 將a切分成三個行向量(一維陣列) # 沿y軸切分陣列: print(np.hsplit(a, 3)) # 將a切分成三個列向量(一維陣列) # 陣列排序 a = np.array(([1, 4, 3], [6, 2, 0], [9, 7, 5])) print(a) # 返回陣列每一列的最大值: print(np.max(a, axis = 0)) # 返回陣列每一行的最小值: print(np.min(a, axis = 1)) # 返回陣列每一列最大元素的index: print(np.argmax(a, axis = 0)) # 返回陣列每一行最小元素的index: print(np.argmin(a, axis = 1)) # Array Count print('Array Count') # 統計陣列每一列的中位數 print(np.median(a, axis = 0)) # 統計陣列各行的sqrt print(np.mean(a, axis = 1)) # 統計陣列每一列的average: print(np.average(a, axis = 0)) # 統計陣列各行的方差: print(np.var(a, axis = 1)) # 統計陣列每一列的標準偏差: print(np.std(a, axis = 0)) # 建立一個6x6的二維陣列,邊界值全為1,Other Value is 0: Z = np.ones((6, 6)) Z[1: -1, 1: -1] = 0 print(Z) # 使用數字0將一個全為1的6x6的二維陣列包圍 Z = np.ones((6, 6)) Z = np.pad(Z, pad_width = 1, mode = 'constant', constant_values = 0) ''' Examples -------- >>> x = np.arange(9).reshape((3,3)) >>> x array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> np.diag(x) array([0, 4, 8]) >>> np.diag(x, k=1) array([1, 5]) >>> np.diag(x, k=-1) array([3, 7]) >>> np.diag(np.diag(x)) array([[0, 0, 0], [0, 4, 0], [0, 0, 8]]) ''' # 建立一個6x6的二維陣列,並設定1,2,3,4,5落在對角線下方: Z = np.diag(1 + np.arange(5), k = -1) # k = 1主對角線 k = -1副對角線 print(Z) # 建立一個10x10的二維陣列,並使得1和0沿對角線間隔放置: Z = np.zeros((10, 10), dtype = int) Z[1::2, ::2] = 1 Z[::2, 1::2] = 1 print(Z) # 建立一個0 - 10的一個一維陣列, 並將(1, 9]之間的全部數值轉換成負數 Z = np.arange(11) print(Z) Z[(1 < Z) & (Z <= 9)] *= -1 print(Z) # 找出兩個一維陣列中相同的元素: Z1 = np.random.randint(0, 10, 10) Z2 = np.random.randint(0, 10, 10) print("Z1:", Z1) print("Z2:", Z2) print(np.intersect1d(Z1, Z2)) # 找出Z1和Z2中的相同元素 # 使用NumPy列印yesterday, today, tomorrow yesterday = np.datetime64('today', 'D') - np.timedelta64(1, 'D') today = np.datetime64('today', 'D') tomorrow = np.datetime64('today', 'D') + np.timedelta64(1, 'D') print("yesterday: ", yesterday) print("today: ", today) print("tomorrow: ", tomorrow) # 使用五種不同的方法提取一個隨機陣列的整數部分 Z = np.random.uniform(0, 10, 10) print('init:', Z) print('way 1:', Z - Z % 1) print('way 2:', np.floor(Z)) print('way 3:', np.ceil(Z) - 1) print('Way 4:', Z.astype(int)) print('Way 5:', np.trunc(Z)) # 建立一個5x5的矩陣,其中每行的數值範圍從1~5: Z = np.zeros((5, 5)) Z += np.arange(1, 6) print(Z) # 建立一個長度為5的等間隔一維陣列,其值域(0,1): # linspace的功能是返回指定區域間隔的陣列,endpoint = True說明右半區間是閉合邊界可以取到 Z = np.linspace(0, 1, 6, endpoint = False)[1:] print(Z) # 建立一個長度為10的一維陣列,並將其按升序排序: Z = np.random.random(10) Z.sort() print(Z) # 建立一個4x4的二維陣列,並按照列進行升序排序 Z = np.array([[7, 4, 3], [3, 1, 2], [4, 2, 6]]) print("original array:\n", Z) Z.sort(axis = 0) print(Z) # 建立一個長度為5的一維陣列,並將其中最大值替換為0 Z = np.random.random(5) print('Original Array:\n', Z) Z[Z.argmax()] = 0 print(Z) # 列印每個NumPy標量型別的min and max: for dtype in [np.int8, np.int32, np.int64]: print("The minimum value of {}: ".format(dtype), np.iinfo(dtype).min) print("The maximum value of {}: ".format(dtype), np.iinfo(dtype).max) for dtype in [np.float32, np.float64]: print("The minimum value of {}: ".format(dtype), np.finfo(dtype).min) print("The maximum value of {}: ".format(dtype), np.finfo(dtype).max) # 將float32轉換為整型: Z = np.arange(10, dtype = np.float32) print(Z) Z = Z.astype(np.int32, copy = False) # copy = False:返回輸入陣列的副本,否則建立一個新的陣列返回 print(Z) # 將隨機二維陣列按照第3列從上到下進行升序排序: Z = np.random.randint(0, 10, (5, 5)) # 返回5x5的二維陣列,裡面的元素為0~9 print("排序前:\n", Z) print(Z[Z[:, 2].argsort()]) # 因為按照第三列排序,排序移動的是每一個行向量 # 從隨機一維陣列中找出距離給定數值(0.5)最近的數: Z = np.random.uniform(0, 1, 20) print('random array:\n', Z) z = 0.5 m = Z.flat[np.abs(Z - z).argmin()] print(m) # 將二維陣列的前兩行進行順序交換 Z = np.arange(25).reshape(5, 5) print(Z) Z[[0, 1]] = Z[[1, 0]] print(Z) # 找出隨機一維陣列中出現頻率最高的值 Z = np.random.randint(0, 10, 50) print('random array:', Z) print(np.bincount(Z).argmax()) # 找出給定一維陣列中非0元素的index: Z = np.nonzero([1, 1, 1, 1, 0, 0, -1, 0]) print(Z) # 給定5x5的二維陣列,在其內部隨機放置p個值為1的數: p = 3 Z = np.zeros((5, 5)) np.put(Z, np.random.choice(range(5 * 5), p, replace = False), 1) print(Z) # 隨機的3x3二維陣列,減去陣列每一行的average: X = np.random.rand(3, 3) print(X) Y = X - X.mean(axis = 1, keepdims = True) print(Y) # 獲得二維陣列點積結果的對角線陣列: X = np.random.uniform(0, 1, (3, 3)) Y = np.random.uniform(0, 1, (3, 3)) print(np.dot(X, Y)) print('speed lower:') # speed low way: print(np.diag(np.dot(X, Y))) # speed quicker way: print('speed quicker:') print(np.einsum("ij, ji->i", X, Y)) # 找到隨機一維陣列前p個最大值 Z = np.random.randint(1, 100, 100) print(Z) p = 5 print(Z[np.argsort(Z)[-p: ]]) # 將二維陣列中所有元素保留兩位小數: Z = np.random.random((5, 5)) print(Z) np.set_printoptions(precision = 2) print(Z) # 使用科學計數法輸出陣列: Z = np.random.random([5, 5]) print(Z) print(Z / 1e3) # 使用NumPy找出百分位數: a = np.arange(15) print(a) print(np.percentile(a, q = [25, 50, 75])) # 找出陣列中缺失值的總數以及所在的位置 Z = np.random.rand(10, 10) print("Z:\n", Z) Z[np.random.randint(10, size = 5), np.random.randint(10, size = 5)] = np.nan print(Z) # 從隨機陣列中刪除包含缺失值的行: print(np.sum(np.isnan(Z), axis = 1) == 0) # 統計隨機陣列中的各元素的數量: Z = np.random.randint(0, 100, 25).reshape(5, 5) print(Z) print(np.unique(Z, return_counts = True)) # 將陣列中各元素按指定分類轉換為文字值 Z = np.random.randint(1, 4, 10) print(Z) label_map = {1: 'car', 2: 'bus', 3:'train'} print([label_map[x] for x in Z]) # 列印各元素在陣列中升序排列的index: Z = np.random.randint(100, size = 10) print('Array:', Z) print(Z.argsort()) # 得到二維隨機陣列各行的最大值max: Z = np.random.randint(1, 100, [5, 5]) print(Z) print(np.amax(Z, axis = 1)) # 得到二維隨機陣列各行的最小值min: Z = np.random.randint(1, 100, [5, 5]) print(Z) print(np.apply_along_axis(np.min, arr = Z, axis = 1)) # 計算兩個陣列之間的歐氏距離: X = np.array([1, 2]) Y = np.array([5, 6]) print(np.sqrt(np.power((6 - 2), 2) + np.power((5 - 1), 2))) print(np.linalg.norm(Y - X)) # NumPy中的計算 # 列印複數的實部和虛部 a = np.array([1 + 2j, 3 + 4j, 5 + 6j]) print('real:', a.real) print('imag:', a.imag) # 求解給出矩陣的逆矩陣並驗證: matrix = np.array([[1., 2.], [3., 4.]]) inverse_matrix = np.linalg.inv(matrix) # 驗證原矩陣和逆矩陣想乘是否為單位矩陣E assert np.allclose(np.dot(matrix, inverse_matrix), np.eye(2)) print(inverse_matrix) # 使用Z-Score標準化演算法對資料進行標準化處理Z = (X - mean(X)) / sd(X) def zscore(x, axis = None): xmean = x.mean(axis, keepdims = True) xstd = np.std(x, axis = axis, keepdims = True) zscore = (x - xmean) / xstd return zscore Z = np.random.randint(10, size = (5, 5)) print(Z) print('Z-Score\n') print(zscore(Z)) # 使用Min-Max標準化演算法對資料進行標準化處理:Y = (Z - min(Z)) / max(Z) - min(Z) def min_max(x, axis = None): min = X.min(axis = axis, keepdims = True) max = X.max(axis = axis, keepdims = True) result = (x - min) / (max - min) return result Z = np.random.randint(10, size = (5, 5)) print('original Z\n') print(Z) print(min_max(Z)) # 使用L2範數對資料進行標準化處理L2 = sqrt(pow(x1, 2) + pow(x2, 2) + ....pow(xn,2)) def l2_normalize(v, axis = 1, order = 2): l2 = np.linalg.norm(v, ord = order, axis = axis, keepdims = True) l2[l2 == 0] = 1 return v / 12 z = np.random.randint(10, size = (5, 5)) print(z) print(l2_normalize(z)) # 使用NumPy計算變數直接的相關性係數: Z = np.array([ [1, 2, 1, 9, 10, 3, 2, 6, 7], # 特徵A [2, 1, 8, 3, 7, 5, 10, 7, 2], # 特徵B [2, 1, 1, 8, 9, 4, 3, 5, 7] # 特徵C ]) ''' 相關性係數取值從 [−1,1] 變換,靠近 1 則代表正相關性較強, −1 則代表負相關性較強。 結果如下所示,變數 A 與變數 A 直接的相關性係數為 1,因為是同一個變數。 變數 A 與變數 C 之間的相關性係數為 0.97,說明相關性較強。 ''' print(np.corrcoef(Z)) # 使用NumPy計算矩陣的特徵值和特徵向量 M = np.matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) w, v = np.linalg.eig(M) print(w) print(v) # 驗證 print(v * np.diag(w) * np.linalg.inv(v)) print('===========') # 使用NumPy計算Ndarray兩相鄰元素差值: z = np.random.randint(1, 10, 10) print(Z) print(np.diff(Z, n = 1)) print(np.diff(Z, n = 2)) print(np.diff(Z, n = 3)) print('add===============') # NumPy將Ndarray相鄰元素依次累加 Z = np.random.randint(1, 10, 10) print(Z) print(np.cumsum(Z)) # 使用NumPy按列連線兩個陣列: m1 = np.array([1, 2, 3]) m2 = np.array([4, 5, 6]) print(np.c_[m1, m2]) # 使用NumPy按行連線兩個陣列: m1 = np.array([1, 2, 3]) m2 = np.array([4, 5, 6]) print(np.r_[m1, m2]) # 使用NumPy列印9*9乘法表 print(np.fromfunction(lambda x, y: (x + 1) * (y + 1), (9, 9))) print('image =============') # 使用NumPy將圖片轉為Ndarray陣列: from io import BytesIO from PIL import Image import pylab import PIL import requests # 通過連結下載影象 URL = 'https://i.loli.net/2020/07/16/9H6Kwo8vifTVS7O.jpg' response = requests.get(URL) # 將內容讀取為影象 I = Image.open(BytesIO(response.content)) # 將影象轉換為 Ndarray picture = np.asarray(I) print(picture) # 將轉換後的 Ndarray 重新繪製成影象 from matplotlib import pyplot as plt plt.imshow(picture) pylab.show()