從事數據科學和機器學習的人都知道,numpy是必備的工具之一。在numpy中,切片(slicing)是經常用到的操作之一。簡單的切片是很容易掌握的,但是當涉及到多維數組,或者需要高效地選擇元素時,我們就需要更加高效和優美的numpy切片技巧。
一、基礎的切片操作
要理解高級切片技巧,首先需要掌握numpy基礎切片操作。以一維數組為例:
import numpy as np
array = np.array([1, 2, 3, 4, 5])
# 選擇第2到第4個元素
array[1:4] #=> array([2, 3, 4])
# 從第2個元素起,每隔一個取一個元素
array[1:4:2] #=> array([2, 4])
# 可以用負數索引
array[-2:] #=> array([4, 5])
在切片操作中,冒號(:)用於指定選擇範圍,第一個數表示起始位置(包含),第二個數表示結束位置(不包含),第三個數表示步長。
對於多維數組,每個維度可以分別進行切片:
array = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
# 選擇第1行
array[0] #=> array([1, 2, 3])
# 選擇第1、2行
array[:2] #=> array([[1, 2, 3],
[4, 5, 6]])
# 選擇第2列
array[:, 1] #=> array([2, 5, 8])
# 選擇第1、2行,第2、3列
array[:2, 1:] #=> array([[2, 3],
[5, 6]])
二、布爾型切片
numpy允許使用布爾型數組進行切片。例如,我們可以選擇滿足某個條件的所有元素。
array = np.array([1, 2, 3, 4, 5])
mask = array % 2 == 0
array[mask] #=> array([2, 4])
對於多維數組,我們可以使用多維布爾型數組進行切片。例如,選擇所有大於5的元素:
array = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
mask = array > 5
array[mask] #=> array([6, 7, 8, 9])
三、花式索引
花式索引(fancy indexing)指的是通過整數數組或布爾型數組選擇數組中的元素。與切片不同,花式索引會複製選取的元素,而不是引用它們。
array = np.array([1, 2, 3, 4, 5])
# 選擇第1、3、5個元素
indices = [0, 2, 4]
array[indices] #=> array([1, 3, 5])
對於多維數組,我們可以使用多個整數數組或一個布爾型數組選擇元素。例如,選擇第1、3行和第2、3列的元素:
array = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
# 選擇第1、3行和第2、3列的元素
indices_row = [0, 2]
indices_col = [1, 2]
array[indices_row][: ,indices_col] #=> array([[2, 3],
[8, 9]])
四、組合切片技巧
最後,我們可以將基礎切片、布爾型切片和花式索引結合起來,實現更加高效、靈活的切片操作。
例如,選擇第偶數行,第奇數列的元素:
array = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12]
])
# 選擇第偶數行,第奇數列
mask_row = np.array([False, True, False, True])
mask_col = np.array([True, False, True])
array[mask_row][:, mask_col] #=> array([[2],
[8]])
五、總結
在numpy中,切片是一種非常基礎和常用的操作。高效、優美的切片技巧可以大大提高代碼的可讀性和執行效率。在實踐中,我們應該靈活地運用基礎切片、布爾型切片、花式索引和組合切片技巧,根據不同情況選擇最合適的方式。
原創文章,作者:ACNXP,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/324898.html