• Python 資料處理_1 : NumPy 基礎教學:陣列運算、索引、隨機分佈與常見函式整理

PS 程式碼後面沒有print(),是因為我用jupyter notebook,如果寫在.py檔,最後印出記得要用 print(包起來)

Contents 目錄

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

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

# 方法二
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

二維

# 一維 -> 二維
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

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

二維矩陣相乘 (答案都相同)

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

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

索引 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

二維

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

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

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

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

練習: 如果我要取每組的第二位

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

這樣會跑掉 array_2d[:3,1]
螢幕擷取畫面 2024-03-22 150445

range zeros ones 建立陣列 np.arange( , ,( ))[ ]

import numpy as np

np.arange(0,10)

螢幕擷取畫面 2024-03-22 150517

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

0的陣列 np.zeros( )、np.zeros(( , ))

import numpy as np

print(np.zeros(5))
print(np.zeros((3,4)))

螢幕擷取畫面 2024-03-22 150757

1的陣列 np.ones(( , )) + 1

import numpy as np

print(np.ones((3,4)) + 1)

(np.ones(5) + 10)

螢幕擷取畫面 2024-03-22 150843

取等距點的值 np.linspace( , , )

0~5 中取十個值

import numpy as np

np.linspace(0,5,10)

螢幕擷取畫面 2024-03-22 150917

NumPy 二維陣列

生成一維數列 -> 再重新排列為二維陣列

等間隔分佈 arange( , ).reshape( , )

均勻分佈 linspace( , ).reshape( , )

創建一個包含1到50 一維NumPy陣列 -> 重新排列為5×10的二維陣列

import numpy as np

np.arange(1,51).reshape(5,10)/100

螢幕擷取畫面 2024-03-22 150958

創建一個有100個均勻分佈在0.0到50的浮點數一維NumPy陣列 -> 重新排列為10×10的二維陣列

import numpy as np

np.linspace(0.1,50,100).reshape(10,10)

螢幕擷取畫面 2024-03-22 151017

整數隨機取值

生成一維數列 -> 再重新排列為二維陣列

有可能重複 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陣列,範圍是120(包括120)
random_array = np.random.randint(1, 21)

random_array

螢幕擷取畫面 2024-03-22 151134

隨機取5個整數數值

import numpy as np

# 隨機生成包含5個整數的一維NumPy陣列,範圍是120(包括120)
random_array = np.random.randint(1, 21, 5)
random_array

螢幕擷取畫面 2024-03-22 151222

二維

import numpy as np

# 隨機生成包含5個整數的一維NumPy陣列,範圍是120(包括120) -> 轉為二維
# 等同 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

不重複

一維

import numpy as np

# 隨機生成包含5個不重複整數的一維NumPy陣列,範圍是120(包括120)
random_array = np.random.choice(np.arange(1, 21), size=5, replace=False)

random_array

螢幕擷取畫面 2024-03-22 151350

二維

import numpy as np

# 隨機生成包含5個不重複整數的一維NumPy陣列,範圍是120(包括120) -> 轉為二維
random_array = np.random.choice(np.arange(1, 21), size=6, replace=False).reshape(2,3)

random_array

螢幕擷取畫面 2024-03-22 151420

意思相同,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)

小數隨機取值

自定範圍內,隨機取小數 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

隨機取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

二維
陣列小數

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

從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

印出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

取最大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

均值(平均值)為 0,標準差為 1, 隨機常態分佈 np.random.randn( )

均值(平均值)為 0,標準差為 1, 隨機常態分佈

import numpy as np

random_normal = np.random.randn(6)

random_normal

螢幕擷取畫面 2024-03-22 160404

均值(平均值)為 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

均值為 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

標準差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

標準差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

更改數值

一維

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

二維

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

插入數值 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

二維

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

複製 .copy(),原始array 不受.copy() 影響

final_copy = final.copy()
final_copy[:] = 100

final_copy

螢幕擷取畫面 2024-03-22 153139

增加判斷值

一維

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

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

可以寫在一起
“`=
import numpy as np
array_ = np.arange(1,11)
boolarray = array > 5
result = array
[boolarray]

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

圖像

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

節點

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

迴歸預測

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

Catalina
Catalina

Hi, I’m Catalina!
原本在西語市場做開發業務,2023 年正式轉職資料領域。
目前努力補齊計算機組織、微積分、線性代數與機率論,忙碌中做點筆記提醒自己 🤲

文章: 43

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *