# **【Python 資料處理_1 : NumPy】** :::info - NumPy - 基本計算 arr1=np.array([ , , , , ])… 、 arr1+arr2 - 索引 arr=np.array([ , , , , ])、arr[1:3]、arr[arr>3] - range zeros ones 建立陣列 np.arange( , ,( ))[ ] - 0的陣列 np.zeros( )、np.zeros(( , )) - 1的陣列 np.ones(( , )) + 1 - 取等距點的值 np.linspace( , , ) - NumPy 二維陣列 - 生成一維數列 -> 再重新排列為二維陣列 - 等間隔分佈 arange( , ).reshape( , ) - 均勻分佈 linspace( , ).reshape( , ) - 整數隨機取值 - 生成一維數列 -> 再重新排列為二維陣列 - 有可能重複 np.random.randint( , , ).reshape( , ) - 不重複np.random.choice(np.arange( , ), size= , replace=False).reshape( , ) - 小數隨機取值 - 自定範圍內,隨機取小數 np.random.uniform(1, 10, 6).reshape(3,2) - 從0到1均勻分佈 np.random.rand( , ) - 設置 seed np.random.seed( ) - 印出shape arr = np.array([ , , , , ])、arr.shape - 取最大or最小的索引值 arr = np.array([ , , , , ])、arr.argmax()、arr.argmin() - 均值(平均值)為 0,標準差為 1, 隨機常態分佈 np.random.randn( ) - 均值為 0,標準差為 1,隨機常態二維分佈圖 np.random.normal(size=( , ))、random_data.flatten() - 標準差50 常態分佈圖 np.random.normal((loc= , scale= , size= )) - 標準差10 常態分佈圖 np.random.normal((loc= , scale= , size= )) - 更改數值 - 插入數值 np.append(matrix, new_element)、np.vstack((final, [new_element])) - 複製 .copy(),原始array 不受.copy() 影響 - 增加判斷值 - 圖像 - 節點 - 迴歸預測 ::: PS 程式碼後面沒有print(),是因為我用jupyter notebook,如果寫在.py檔,最後印出記得要用 print(包起來) ## **NumPy** ### 基本計算 arr1=np.array([ , , , , ])... 、 arr1+arr2、np.dot(np5, np6)、np5.dot(np6) 一維 ```= # 方法一 import numpy as np arr1 = np.array([1, 2, 3]) arr2 = np.array([4, 5, 6]) # 元素相加 result1 = arr1 + arr2 # 元素相減 result2 = arr1 - arr2 result2_2 = arr1 -1 # 元素相乘 result3 = arr1 * arr2 result3_2 = arr2 ** 2 result3_3 = arr2 ** 3 print(result1) print(result2) print(result2_2) print(result3) print(result3_2) print(result3_3) ``` ![螢幕擷取畫面 2024-03-22 144343](https://hackmd.io/_uploads/H1-2OjqR6.png) ```= import numpy as np arr1 = np.array([1, 2, 3]) arr2 = np.array([4, 5, 6]) # 元素平方 result4 = np.square(arr1) # 元素求和 result5 = np.sum(arr1) # 元素均值 # 可以改 max, min result6 = np.mean(arr1) # 這樣也行 result6_2 = arr1 + arr2 result6_2.mean() # 計算 result7 = arr1 / arr1 result8 = 1 / arr1 # 平方根 result9 = np.sqrt(arr2) # 度量函數 result10 = np.sin(arr2) # 對數 result11 = np.log(arr2) print(result4) print(result5) print(result6) print(result6_2) print(result7) print(result8) print(result9) print(result10) print(result11) ``` ![螢幕擷取畫面 2024-03-22 144722](https://hackmd.io/_uploads/Sk-5tjq06.png) ```= # 方法二 import numpy as np lst1 = [1, 2, 3, 4] lst2 = [5, 6, 7, 8] np1 = np.array(lst1+lst2) np1 # 會印出 array([1, 2, 3, 4, 5, 6, 7, 8]) ``` ![螢幕擷取畫面 2024-03-22 144900](https://hackmd.io/_uploads/rkGe5ic0p.png) 二維 ```= # 一維 -> 二維 import numpy as np lst5 = [1,2,3,4] lst6 = [5,6,7,8] np5 = np.array(lst5) np6 = np.array(lst6) np7 = np.array(lst5+lst6) ans = np7.reshape((4,2)) print(ans) print(np7.sum()) ``` ![螢幕擷取畫面 2024-03-22 145206](https://hackmd.io/_uploads/SJ-o9s5Ca.png) ```= import numpy as np # 假設有一個名為final的矩陣 final = np.array([[1, 2], [3, 4]]) # 增加所有元素的值 final += 5 # 相乘所有元素的值 final_2 = final * 5 print("增加後的矩陣:") print(final) print("相乘後的矩陣:") print(final_2) ``` ![螢幕擷取畫面 2024-03-22 145407](https://hackmd.io/_uploads/H1iMijc0T.png) 二維矩陣相乘 (答案都相同) ```= lst5 = [1,2,3,4] lst6 = [5,6,7,8] np5 = np.array(lst5) np6 = np.array(lst6) np5.dot(np6) #  相同 lst5 = [1,2,3,4] lst6 = [5,6,7,8] np5 = np.array(lst5) np6 = np.array(lst6) result_matrix = np.dot(np5, np6) result_matrix ``` ![螢幕擷取畫面 2024-03-22 145538](https://hackmd.io/_uploads/S1pOjiqRT.png) ```= import numpy as np array_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) x = array_2d.sum(axis=0) y = array_2d.sum(axis=1) std = array_2d.std() # 等同 np.std(array_2d) print(x) print(y) print(std) ``` ![螢幕擷取畫面 2024-03-22 145632](https://hackmd.io/_uploads/Syr6jiqRa.png) ### 索引 arr=np.array([ , , , , ])、arr[1:3]、arr[arr>3] 一維 ```= import numpy as np arr = np.array([1, 2, 3, 4, 5]) # 獲取單個元素 element = arr[0] # 獲取範圍內 ALL元素 element = arr[:] # 獲取範圍內的元素 (看index! 取index1~index3) sub_arr = arr[1:4] # 條件索引 filtered_arr = arr[arr > 3] print(element) print(sub_arr) print(filtered_arr) ``` ![螢幕擷取畫面 2024-03-22 150031](https://hackmd.io/_uploads/ByGo2i5Aa.png) 二維 ```= import numpy as np array_2d = np.array([[1,2,3],[4,5,6],[7,8,9]]) array_2d[0][0] ``` ![螢幕擷取畫面 2024-03-22 150059](https://hackmd.io/_uploads/SJ22ho5A6.png) ```= import numpy as np array_2d = np.array([[1,2,3],[4,5,6],[7,8,9]]) print(array_2d[2,:]) print(array_2d[-1,:]) ``` ![螢幕擷取畫面 2024-03-22 150208](https://hackmd.io/_uploads/HJJ-pi9Aa.png) ```= import numpy as np array_2d = np.array([[1,2,3],[4,5,6],[7,8,9]]) array_2d[1:3,:] ``` ![螢幕擷取畫面 2024-03-22 150252](https://hackmd.io/_uploads/S11Vpo5Cp.png) ```= import numpy as np array_2d = np.array([[1,2,3],[4,5,6],[7,8,9]]) array_2d[:2,1:] ``` ![螢幕擷取畫面 2024-03-22 150334](https://hackmd.io/_uploads/rkpL6s9Ca.png) 練習: 如果我要取每組的第二位 ```= import numpy as np array_2d = np.array([[1,2,3],[4,5,6],[7,8,9]]) array_2d[0:3,1:2] ``` ![螢幕擷取畫面 2024-03-22 150404](https://hackmd.io/_uploads/SymFTocAT.png) > 這樣會跑掉 array_2d[:3,1] > ![螢幕擷取畫面 2024-03-22 150445](https://hackmd.io/_uploads/ByJopo9C6.png) ### range zeros ones 建立陣列 np.arange( , ,( ))[ ] ```= import numpy as np np.arange(0,10) ``` ![螢幕擷取畫面 2024-03-22 150517](https://hackmd.io/_uploads/r1A26sqR6.png) ```= import numpy as np print(np.arange(0,15,2)) print(np.arange(0,15,2)[2]) print(np.arange(0,15,2)[0:3]) # = np.arange(0,15,2)[:3] ``` ![螢幕擷取畫面 2024-03-22 150647](https://hackmd.io/_uploads/HJIzCj9Cp.png) ### 0的陣列 np.zeros( )、np.zeros(( , )) ```= import numpy as np print(np.zeros(5)) print(np.zeros((3,4))) ``` ![螢幕擷取畫面 2024-03-22 150757](https://hackmd.io/_uploads/ByFU0j906.png) ### 1的陣列 np.ones(( , )) + 1 ```= import numpy as np print(np.ones((3,4)) + 1) (np.ones(5) + 10) ``` ![螢幕擷取畫面 2024-03-22 150843](https://hackmd.io/_uploads/Bkdt0i5Rp.png) ### 取等距點的值 np.linspace( , , ) 0~5 中取十個值 ```= import numpy as np np.linspace(0,5,10) ``` ![螢幕擷取畫面 2024-03-22 150917](https://hackmd.io/_uploads/S1oj0i5Rp.png) ### NumPy 二維陣列 ### 生成一維數列 -> 再重新排列為二維陣列 ### 等間隔分佈 arange( , ).reshape( , ) ### 均勻分佈 linspace( , ).reshape( , ) 創建一個包含1到50 一維NumPy陣列 -> 重新排列為5x10的二維陣列 ```= import numpy as np np.arange(1,51).reshape(5,10)/100 ``` ![螢幕擷取畫面 2024-03-22 150958](https://hackmd.io/_uploads/rJPARi90p.png) 創建一個有100個均勻分佈在0.0到50的浮點數一維NumPy陣列 -> 重新排列為10x10的二維陣列 ```= import numpy as np np.linspace(0.1,50,100).reshape(10,10) ``` ![螢幕擷取畫面 2024-03-22 151017](https://hackmd.io/_uploads/ry21139Ra.png) ### 整數隨機取值 ### 生成一維數列 -> 再重新排列為二維陣列 ### 有可能重複 np.random.randint( , , ).reshape( , ) ### =等於 random_array = np.random.randint( ,  , ( , )),直接生成二維陣列 ### 不重複 np.random.choice(np.arange( , ), size= , replace=False).reshape( , ) > 整數 有可能重複 一維 隨機取1個整數數值 ```= import numpy as np # 隨機生成包含1個整數的一維NumPy陣列,範圍是1到20(包括1和20) random_array = np.random.randint(1, 21) random_array ``` ![螢幕擷取畫面 2024-03-22 151134](https://hackmd.io/_uploads/S1EEkh9Ra.png) 隨機取5個整數數值 ```= import numpy as np # 隨機生成包含5個整數的一維NumPy陣列,範圍是1到20(包括1和20) random_array = np.random.randint(1, 21, 5) random_array ``` ![螢幕擷取畫面 2024-03-22 151222](https://hackmd.io/_uploads/B1-Dyh5Aa.png) 二維 ```= import numpy as np # 隨機生成包含5個整數的一維NumPy陣列,範圍是1到20(包括1和20) -> 轉為二維 # 等同 random_array = np.random.randint(1, 21, (2,3)),可以直接包進去變二維,不需要.reshape( , ) random_array = np.random.randint(1, 21, 6).reshape(2,3) random_array ``` ![螢幕擷取畫面 2024-03-22 151243](https://hackmd.io/_uploads/HJouk2cCa.png) >不重複 > 一維 ```= import numpy as np # 隨機生成包含5個不重複整數的一維NumPy陣列,範圍是1到20(包括1和20) random_array = np.random.choice(np.arange(1, 21), size=5, replace=False) random_array ``` ![螢幕擷取畫面 2024-03-22 151350](https://hackmd.io/_uploads/rkK2kn9Ap.png) 二維 ```= import numpy as np # 隨機生成包含5個不重複整數的一維NumPy陣列,範圍是1到20(包括1和20) -> 轉為二維 random_array = np.random.choice(np.arange(1, 21), size=6, replace=False).reshape(2,3) random_array ``` ![螢幕擷取畫面 2024-03-22 151420](https://hackmd.io/_uploads/SJcCk29Cp.png) <br/> > 意思相同,True 允許重複 > random_array = np.random.randint(1, 21, 6).reshape(2,3) = np.random.choice(np.arange(1, 21), size=6, replace=True).reshape(2,3) <br/> ### 小數隨機取值 ### 自定範圍內,隨機取小數 np.random.uniform(1, 10, 6).reshape(3,2) ### 從0到1均勻分佈 >自定範圍內 一維 隨機取1個小數數值 ```= import numpy as np # 1~10中取 random_array_uni = np.random.uniform(1, 10) # 四捨五入到小數點後兩位 rounded_array = np.round(random_array_uni, 2) rounded_array ``` ![螢幕擷取畫面 2024-03-22 155650](https://hackmd.io/_uploads/S1JCKh5CT.png) 隨機取5個小數數值 ```= import numpy as np # 1~10中取五位數 random_array_uni = np.random.uniform(1, 10, 5) # 將每個數四捨五入到小數點後兩位 rounded_array = np.round(random_array_uni, 2) rounded_array ``` ![螢幕擷取畫面 2024-03-22 151739](https://hackmd.io/_uploads/SkJ2eh5Ap.png) 二維 陣列小數 ```= import numpy as np # 1~10中取六位數 random_array_uni = np.random.uniform(1, 10, 6) # 將每個數四捨五入到小數點後兩位 rounded_array = np.round(random_array_uni, 2) rounded_array.reshape(3,2) ``` ![螢幕擷取畫面 2024-03-22 152551](https://hackmd.io/_uploads/BJcYz290a.png) > 從0到1均勻分佈 ```= import numpy as np random_array_uni_rand = np.random.rand(2,3) random_array_uni_rand ``` ![螢幕擷取畫面 2024-03-22 152635](https://hackmd.io/_uploads/SyT3fn9Ap.png) <br/> ### 設置 seed np.random.seed( ) ```= import numpy as np # 設置隨機數生成器的種子 np.random.seed(101) # 隨機數在每次運行時都將是【相同】的 random_value = np.random.choice([1, 2, 3, 4, 5]) print("隨機選擇的值:", random_value) ``` ![螢幕擷取畫面 2024-03-22 152704](https://hackmd.io/_uploads/rkUCfhqAp.png) ### 印出shape arr = np.array([ , , , , ])、arr.shape ```= import numpy as np # 創建一個二維數組 arr = np.array([[1, 2, 3], [4, 5, 6]]) arr.shape ``` ![螢幕擷取畫面 2024-03-22 160230](https://hackmd.io/_uploads/r1TNj2cAp.png) ### 取最大or最小的索引值 arr = np.array([ , , , , ])、arr.argmax()、arr.argmin() ```= import numpy as np arr = np.array([10, 5, 8, 15, 3]) max_index = arr.argmax() min_index = arr.argmin() print("最大值的索引是:", max_index) print("最小值的索引是:", min_index) ``` ![螢幕擷取畫面 2024-03-22 160340](https://hackmd.io/_uploads/Sy5wo3cCa.png) ### 均值(平均值)為 0,標準差為 1, 隨機常態分佈 np.random.randn( ) 均值(平均值)為 0,標準差為 1, 隨機常態分佈 ```= import numpy as np random_normal = np.random.randn(6) random_normal ``` ![螢幕擷取畫面 2024-03-22 160404](https://hackmd.io/_uploads/BJ-Ki29CT.png) 均值(平均值)為 0,標準差為 1,隨機常態分佈繪圖 ```= import numpy as np import matplotlib.pyplot as plt # 生成更多符合標準正態分佈的隨機數 random_data = np.random.randn(1000) # 繪製直方圖 # bins長條圖數量 #density=True 總面積等於1 #alpha透明度 plt.hist(random_data, bins=50, density=True, alpha=0.6, color='b', edgecolor='black') plt.xlabel('隨機數值') plt.ylabel('概率密度') plt.title('正態分佈直方圖') plt.grid(True) plt.show() ``` ![螢幕擷取畫面 2024-03-22 160429](https://hackmd.io/_uploads/Hkcqo2cRa.png) ### 均值為 0,標準差為 1,隨機常態二維分佈圖 np.random.normal(size=( , ))、random_data.flatten() ```= import numpy as np import matplotlib.pyplot as plt # 生成 20x30 的常態分佈的隨機數 random_data = np.random.normal(size=(20, 30)) # 展平成一維陣列 flattened_data = random_data.flatten() # 繪製直方圖 plt.hist(flattened_data, bins=10, density=True, alpha=0.6, color='b', edgecolor='black') plt.xlabel('隨機數值') plt.ylabel('概率密度') plt.title('常態分佈直方圖 (範圍1~100)') plt.grid(True) plt.show() ``` ![螢幕擷取畫面 2024-03-22 152854](https://hackmd.io/_uploads/BJVS72c0a.png) ### 標準差50 常態分佈圖 np.random.normal((loc= , scale= , size= )) ```= import numpy as np import matplotlib.pyplot as plt # 生成 1000 個符合標準差為 50 的正態分佈的隨機數 random_data = np.random.normal(loc=0, scale=50, size=1000) # 繪製直方圖 plt.hist(random_data, bins=50, density=True, alpha=0.6, color='b', edgecolor='black') plt.xlabel('隨機數值') plt.ylabel('概率密度') plt.title('正態分佈直方圖 (標準差 = 50)') plt.grid(True) plt.show() ``` ![螢幕擷取畫面 2024-03-22 152915](https://hackmd.io/_uploads/ryOLX25C6.png) ### 標準差10 常態分佈圖 np.random.normal((loc= , scale= , size= )) ```= import numpy as np import matplotlib.pyplot as plt # 生成 1 維常態分佈的隨機數(範圍-30~40) random_data = np.random.normal(loc=5, scale=10, size=1000) # 均值為 5,標準差為 10 # 繪製直方圖 plt.hist(random_data, bins=30, density=True, alpha=0.6, color='b', edgecolor='black') plt.xlabel('隨機數值') plt.ylabel('概率密度') plt.title('常態分佈直方圖 (範圍-30~40)') plt.grid(True) plt.show() ``` ![螢幕擷取畫面 2024-03-22 152936](https://hackmd.io/_uploads/SyN_m2qA6.png) ### 更改數值 一維 ```= import numpy as np # 創建一個空的 1D NumPy 數組 final = np.empty(2, dtype=int) # 將數組的第一個元素設置為 18 final[0] = 18 final[1] = 20 final[0] = 30 final ``` ![螢幕擷取畫面 2024-03-22 153008](https://hackmd.io/_uploads/rke57290p.png) 二維 ```= import numpy as np final = np.empty(4, dtype=int) final_2d = final.reshape(2, 2) final_2d[0][0] = 10 final_2d[0][1] = 15 final_2d[1][0] = 20 final_2d[1][1] = 25 final_2d[1][0] = 30 final_2d ``` ![螢幕擷取畫面 2024-03-22 153027](https://hackmd.io/_uploads/SkXjmncCT.png) ### 插入數值 np.append(matrix, new_element)、np.vstack((final, [new_element])) 一維 ```= # 增加 index 到最後 final = [1,2,3,4,5,6] matrix = final new_element = 350 matrix = np.append(matrix, new_element) matrix ``` ![螢幕擷取畫面 2024-03-22 153046](https://hackmd.io/_uploads/BkI3X25A6.png) 二維 ```= import numpy as np final = np.array([[1, 2], [3, 4]]) # 要添加的新元素 new_element = 350, 300 matrix_2 = np.vstack((final, [new_element])) matrix_2 ``` ![螢幕擷取畫面 2024-03-22 153122](https://hackmd.io/_uploads/By807hcC6.png) ### 複製 .copy(),原始array 不受.copy() 影響 ```= final_copy = final.copy() final_copy[:] = 100 final_copy ``` ![螢幕擷取畫面 2024-03-22 153139](https://hackmd.io/_uploads/HyF1E3qR6.png) ### 增加判斷值 一維 ```= import numpy as np array_1d = np.array([1, 2, 3]) boo1_arr = array_1d > 1 print(boo1_arr) print(boo1_arr.astype(int)) # array_ = np.arange(1,11) bool_array_ = array_ > 5 print(bool_array_) print(bool_array_.astype(int)) ``` ![螢幕擷取畫面 2024-03-22 154024](https://hackmd.io/_uploads/ry8eIncCa.png) ```= import numpy as np array_1d = np.array([1, 2, 3]) boo1_arr = array_1d > 1 print(boo1_arr) print(boo1_arr.astype(int)) ``` ![螢幕擷取畫面 2024-03-22 154105](https://hackmd.io/_uploads/B1yXLn5Rp.png) > 可以寫在一起 ```= import numpy as np array_ = np.arange(1,11) bool_array_ = array_ > 5 result = array_[bool_array_] result ``` ![螢幕擷取畫面 2024-03-22 153442](https://hackmd.io/_uploads/BJysEhqR6.png) <br/> 二維 ``` import numpy as np array_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) boo1_arr = array_2d > 5 print(boo1_arr) print(boo1_arr.astype(int)) ``` ![螢幕擷取畫面 2024-03-22 154201](https://hackmd.io/_uploads/B1ULI3cA6.png) <br/> > 二維只會印出符合條件的 ```= import numpy as np array_2d = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]]) boo1_arr = array_2d > 5 result = array_2d[boo1_arr] result ``` ![螢幕擷取畫面 2024-03-22 154458](https://hackmd.io/_uploads/HJ2ZPh9Rp.png) ### 圖像 ```= import numpy as np import matplotlib.pyplot as plt # 建立一個簡單的圖像矩陣 image_matrix = np.random.random((100, 100)) # 顯示影像 plt.imshow(image_matrix, cmap='gray') plt.title("隨機產生的圖像") plt.show() ``` ![螢幕擷取畫面 2024-03-22 154529](https://hackmd.io/_uploads/SySmP2c0a.png) ### 節點 ```= import numpy as np # 建立一個範例的鄰接矩陣表示圖結構 adjacency_matrix = np.array([[0, 1, 1], [1, 0, 0], [1, 0, 0]]) # 判斷節點之間是否有連接 if adjacency_matrix[0, 1] == 1: print("節點0和節點1有連接") else: print("節點0和節點1無連接") # 會印出 節點0和節點1有連接 ``` ![螢幕擷取畫面 2024-03-22 154617](https://hackmd.io/_uploads/HyDUv3qAT.png) ### 迴歸預測 ```= import numpy as np import pandas as pd from sklearn.linear_model import LinearRegression # 建立範例資料集(學習時間和成績) data = pd.DataFrame({'學習時間(小時)': [1, 2, 3, 4, 5], '成績': [60, 70, 75, 55, 90]}) # 建立線性迴歸模型 model = LinearRegression() # 擬合模型 X = data[['學習時間(小時)']] # 自變數:學習時間 y = data['成績'] # 因變數:成績 model.fit(X, y) # 預測新數據點的成績 new_study_time = np.array([4]).reshape(-1, 1) # 新的學習時間 predicted_score = model.predict(new_study_time) # 列印資料表 print(data) print("預測的成績:", predicted_score) ``` ![螢幕擷取畫面 2024-03-22 154710](https://hackmd.io/_uploads/ry5KD2qR6.png)