文章目錄
- 前言
- 一、廣播機制
- 二、數組遍歷
- 1.for循環
- 2.nditer函數
- 三、數組操作
- 1.reshape函數
- 2.flat屬性
- 3.flatten函數
- 4.revel函數
- 5.數組轉置
- 6.升維與降維
- 7.數組的連接與分割
- 8.數組運算
前言
- 通過今天的學習,我進一步掌握了更多numpy的語法知識
一、廣播機制
- 廣播(Broadcast)是 numpy 對不同形狀(shape)的數組進行數值計算的方式
- 核心是對形狀較小的數組,在維度為1的橫向或縱向上進行一定次數的重復,使其與形狀較大的數組擁有相同的維度
a = np.array([[1, 2, 3], [4, 5, 6]]) # 形狀: (2, 3)
b = np.array([10, 20, 30]) # 形狀: (3,)
c = a + b
print(c)
tips:b是一維數組,可以暫時看做一行三列,通過廣播機制變為兩行三列即可與a相加
二、數組遍歷
1.for循環
- 使用for循環遍歷數組的第一維度,可以理解為拆開數組第一層括號的結果
arr = np.array([[1, 2, 3], [4, 5, 6]])
for i in arr:print(i)
2.nditer函數
- nditer函數一般用于遍歷多維數組中的每一個元素
- 相較于flat屬性可以進行更加復雜的遍歷操作,如修改元素,以及指定遍歷順序等等
for i in np.nditer(arr,order="c"):print(i,end=",")
- 使用flags參數指定迭代器額外行為;multi_index: 返回每個元素的多維索引。external_loop: 返回一維數組而不是單個元素
it = np.nditer(arr, flags=['multi_index'])
for x in it:print(f"元素: {x}, 對應索引: {it.multi_index}")
print(" ")
for x in np.nditer(arr, flags=['external_loop'], order='f'):print(x)
三、數組操作
1.reshape函數
- 返回一個新數組,要求與原數組的元素個數保持一致
- 新數組是原數組的視圖,對新數組進行修改會直接影響原數組
arr = np.array([1,2,3,4,5,6])
arr_1 = arr.reshape((2,3))
arr_2 = arr.reshape((3,-1)) #-1作為占位符,numpy自動計算
arr_3 = arr.reshape((2,3,1)) #可以理解為分為2個二維數組,每個二維數組是三行一列
2.flat屬性
- 與nditer函數有相似的功能,用于行以優先遍歷數組元素,返回一個一維迭代器
arr = np.array([1,2,3,4,5,6])
for i in arr.flat:print(i)
print(arr.flat)
3.flatten函數
- 將多維數組轉化為一維數組
- 返回的是原數組的深拷貝,修改并不會影響原數組
arr = np.array([[1, 2, 3], [4, 5, 6]])
flat_arr = arr.flatten(order='C') #按行優先順序展開
print(flat_arr)
flat_arr[-1] = 7
print(arr)
4.revel函數
- 將多維數組轉化為一維數組
- 返回的是原數組的視圖,修改會直接影響原數組
arr = np.array([[1, 2, 3], [4, 5, 6]])
ravel_arr = arr.ravel() #按行優先順序展開
print(ravel_arr)
ravel_arr[-1] = 7
print(arr)
5.數組轉置
- 在numpy中數組的轉置與數學意義上的轉置相同,可以使用transpose函數或者T屬性
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(np.transpose(arr))
print(arr.T)
6.升維與降維
- 使用expand_dims和squeeze函數即可對數組進行升維和降維
a = np.array([1, 2, 3])
b = np.expand_dims(a, axis=0) #行方向升維
print(b)
c = np.expand_dims(a, axis=1) #列方向升維
print(c)c = np.array([[[1, 2, 3]]])
d = np.squeeze(c, axis=0)
print(d)
e = np.squeeze(c, axis=1)
print(e)
try:f = np.squeeze(c, axis=2) #指定刪除的維度值必須為1,否則將會報錯
except:print("error")
g = np.squeeze(c, axis=None) #若為None,則刪除數組維度中所有為 1 的項
print(g)
tips:降維要求降低的維度數必須為1,否則報錯;如果不指定降維的軸,則會對所有維度為1的軸進行降維
7.數組的連接與分割
- 使用hstack和vstack函數對數組進行垂直,水平拼接
- 要求使用時對應維度的形狀相同
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5], [6]])
result = np.hstack((arr1, arr2)) #豎直拼接
print(result)arr1 = np.array([1, 2, 3])
arr2 = np.array([[4, 5, 6],[7,8,9]])
result = np.vstack((arr1, arr2)) #水平拼接
print(result)
- 使用hsplit和vsplit函數對數組進行垂直,水平分割
- 需要指定分割處的索引
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
result = np.hsplit(arr, [1, 3]) #在索引1,3處分割
print(result[2])
result = np.vsplit(arr, [1]) #在索引1處分割
print(result[0])
8.數組運算
- 對于二維數組,np.dot相當于矩陣乘法
- 對于一維數組,np.dot相當于向量點積
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
result = np.dot(a, b)
print(result)
- np.lianlg.det用于求行列式(要求方陣)
a = np.array([[1, 2], [3, 4]],dtype=int)
det_a = np.linalg.det(a) #計算行列式,要求方陣
print(det_a)
THE END