iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
Python

進擊的Python系列 第 24

Day21-分割與合併陣列

  • 分享至 

  • xImage
  •  

對不起!里維兵長

https://ithelp.ithome.com.tw/upload/images/20240824/20163257ULVNpGmSgA.jpg
https://ithelp.ithome.com.tw/upload/images/20240824/20163257RiPGP3LlYD.jpg
圖片來源:(https://forum.gamer.com.tw/Co.php?bsn=43473&sn=45361)

NumPy陣列分割與合併

# 創建一個隨機陣列
arr = np.random.rand(6, 4)
print(arr)

輸出
[[0.05740255 0.56588944 0.29777472 0.4922545 ][0.1522698  0.3753351  0.87934046 0.05703105][0.65705753 0.76160286 0.93015474 0.16404497][0.39284049 0.26418033 0.05374025 0.89433956][0.66719889 0.98209855 0.42503762 0.18628212][0.81288114 0.48523433 0.42328033 0.2831939 ]]

# 水平分割成兩部分
left, right = np.hsplit(arr, 2)

輸出
[[0.58401272 0.5045574  0.29614647 0.50905332][0.64851305 0.69617266 0.32501001 0.95620193][0.57571878 0.46894043 0.07597078 0.58931756][0.84840314 0.46988579 0.29166666 0.3303905 ][0.67632515 0.30851759 0.55804496 0.65834096][0.37642515 0.43534226 0.70451676 0.46899699]]

# 將兩部分垂直合併
new_arr = np.vstack((left, right))

# 將new_arr沿著行分割成三部分
top, middle, bottom = np.vsplit(new_arr, 3)

分割陣列

  • numpy.split(arr, indices_or_sections, axis=0): 將陣列沿著指定軸分割成多個子陣列
    • arr:要分割陣列
    • indices_or_sections:指定分割點索引或要分割份數
    • axis:指定分割的軸,預設為0(沿著行分割)
  • indices_or_sections: 可以是一個整數,表示要分割的份數;也可以是一個陣列,表示分割點的索引
  • numpy.hsplit(arr, indices_or_sections): 沿著水平軸 (axis=1) 分割陣列
  • numpy.vsplit(arr, indices_or_sections): 沿著垂直軸 (axis=0) 分割陣列
import numpy as np

arr = np.arange(9).reshape(3, 3)
print(arr)

輸出
[[0 1 2]
[3 4 5]
[6 7 8]]

# 分割成三個等份的子陣列
new_arr = np.split(arr, 3)
print(new_arr)
# [array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
# 分割成兩個子陣列,第一個包含兩個元素,第二個包含一個元素
new_arr = np.array_split(arr, [2])
print(new_arr)
# array([[0, 1, 2],[3, 4, 5]]), array([[6, 7, 8]])]
import numpy as np

#產生一個隨機陣列
arr = np.arange(16).reshape(4, 4)
print(arr)

輸出
[[ 0  1  2  3]
 [ 4  5  6  7][ 8  9 10 11]
 [12 13 14 15]]

#水平分割成兩部分
arr1, arr2 = np.hsplit(arr, 2)
print(arr1)
print(arr2)

#垂直分割成兩部分
arr3, arr4 = np.vsplit(arr, 2)
print(arr3)
print(arr4)

#依照索引分割
arr5 = np.array([1, 2, 3, 4, 5, 6])
arr6, arr7 = np.split(arr5, [3])
print(arr6)
print(arr7)

合併陣列

1.np.concatenate()

將多個陣列沿著指定軸連接起來

  • arrays:要連接的陣列的序列
  • axis:指定連接的軸,預設為0(沿著行連接)
import numpy as np

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr3 = np.concatenate((arr1, arr2))
print(arr3)  # 輸出 [1 2 3 4 5 6]
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])

#沿著行連接
c = np.concatenate((a, b), axis=0)
print(c)

輸出
[[1 2]
[3 4]
[5 6]]

#沿著列連接
d = np.concatenate((a, b.T), axis=1)
print(d)

輸出
[[1 2 5]
 [3 4 6]]

指定軸

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6]])
arr3 = np.concatenate((arr1, arr2), axis=0)  # 垂直合併
print(arr3) # 輸出 [[1 2][3 4][5 6]]

2.np.vstack() 和 np.hstack()

分別用於垂直和水平合併

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr3 = np.vstack((arr1, arr2))  # 垂直合併
arr4 = np.hstack((arr1, arr2))  # 水平合併
print(arr3) # 輸出 [[1 2 3][4 5 6]]
print(arr4) # 輸出 [1 2 3 4 5 6] 

3.np.stack()

在一個新軸上堆疊陣列

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr3 = np.stack((arr1, arr2), axis=0)  # 在第0軸堆疊
print(arr3) # 輸出 [[1 2 3][4 5 6]]

注意事項

合併的陣列必須具有相同的形狀,除了要合併的軸
分割時,索引必須在陣列的範圍內

應用場景

  • 資料處理:將大資料集分割成較小部分進行處理
  • 影像處理:將影像分割成不同區域進行分析
  • 機器學習:將特徵矩陣分割成訓練集和測試集

上一篇
Day20-修改陣列形狀與項目
下一篇
Day22-陣列排序
系列文
進擊的Python36
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言