
- NumPy 教程
- NumPy - 首頁
- NumPy - 簡介
- NumPy - 環境
- NumPy 陣列
- NumPy - Ndarray 物件
- NumPy - 資料型別
- NumPy 建立和運算元組
- NumPy - 陣列建立例程
- NumPy - 陣列操作
- NumPy - 從現有資料建立陣列
- NumPy - 從數值範圍建立陣列
- NumPy - 迭代陣列
- NumPy - 重塑陣列
- NumPy - 連線陣列
- NumPy - 堆疊陣列
- NumPy - 分割陣列
- NumPy - 展平陣列
- NumPy - 轉置陣列
- NumPy 索引和切片
- NumPy - 索引和切片
- NumPy - 高階索引
- NumPy 陣列屬性和操作
- NumPy - 陣列屬性
- NumPy - 陣列形狀
- NumPy - 陣列大小
- NumPy - 陣列步長
- NumPy - 陣列元素大小
- NumPy - 廣播
- NumPy - 算術運算
- NumPy - 陣列加法
- NumPy - 陣列減法
- NumPy - 陣列乘法
- NumPy - 陣列除法
- NumPy 高階陣列操作
- NumPy - 交換陣列軸
- NumPy - 位元組交換
- NumPy - 副本和檢視
- NumPy - 元素級陣列比較
- NumPy - 過濾陣列
- NumPy - 連線陣列
- NumPy - 排序、搜尋和計數函式
- NumPy - 搜尋陣列
- NumPy - 陣列的並集
- NumPy - 查詢唯一行
- NumPy - 建立日期時間陣列
- NumPy - 二元運算子
- NumPy - 字串函式
- NumPy - 數學函式
- NumPy - 統計函式
- NumPy - 矩陣庫
- NumPy - 線性代數
- NumPy - Matplotlib
- NumPy - 使用 Matplotlib 繪製直方圖
- NumPy - NumPy 的 I/O 操作
- NumPy 排序和高階操作
- NumPy - 排序陣列
- NumPy - 沿軸排序
- NumPy - 使用花式索引排序
- NumPy - 結構化陣列
- NumPy - 建立結構化陣列
- NumPy - 操作結構化陣列
- NumPy - 欄位訪問
- NumPy - 記錄陣列
- Numpy - 載入陣列
- Numpy - 儲存陣列
- NumPy - 向陣列追加值
- NumPy - 交換陣列的列
- NumPy - 向陣列插入軸
- NumPy 處理缺失資料
- NumPy - 處理缺失資料
- NumPy - 識別缺失值
- NumPy - 刪除缺失資料
- NumPy - 填充缺失資料
- NumPy 效能最佳化
- NumPy - 使用陣列進行效能最佳化
- NumPy - 使用陣列進行向量化
- NumPy - 陣列的記憶體佈局
- Numpy 線性代數
- NumPy - 線性代數
- NumPy - 矩陣庫
- NumPy - 矩陣加法
- NumPy - 矩陣減法
- NumPy - 矩陣乘法
- NumPy - 元素級矩陣運算
- NumPy - 點積
- NumPy - 矩陣求逆
- NumPy - 行列式計算
- NumPy - 特徵值
- NumPy - 特徵向量
- NumPy - 奇異值分解
- NumPy - 求解線性方程組
- NumPy - 矩陣範數
- NumPy 元素級矩陣運算
- NumPy - 求和
- NumPy - 平均值
- NumPy - 中位數
- NumPy - 最小值
- NumPy - 最大值
- NumPy 集合運算
- NumPy - 唯一元素
- NumPy - 交集
- NumPy - 並集
- NumPy - 差集
- NumPy 有用資源
- NumPy 編譯器
- NumPy - 快速指南
- NumPy - 有用資源
- NumPy - 討論
NumPy - 陣列步長
NumPy 陣列步長
在 NumPy 中,步長 是整數元組,表示遍歷陣列時每個維度需要跨越的位元組數。它提供了訪問陣列中的元素而無需顯式複製資料的能力。
步長是根據陣列的形狀和資料型別計算得出的 -
- 對於資料型別為 4 位元組(例如,int32)的一維陣列,步長只是資料型別的大小。
- 對於多維陣列,步長是透過將內部維度的尺寸乘以前一維度的步長來計算的。
在 NumPy 中訪問步長
您可以使用strides 屬性訪問 NumPy 陣列的步長。此屬性返回一個元組,其中每個值表示在記憶體中移動以訪問沿每個維度下一個元素所需的位元組數。
示例
在以下示例中,我們使用 NumPy 的“stride”屬性計算陣列的步長 -
import numpy as np # Creating a 2D array array = np.array([[1, 2, 3], [4, 5, 6]]) # Accessing the strides print("Array strides:", array.strides)
步長 (24, 8) 表示要從一行移動到下一行,跳過 24 個位元組;要從一列移動到下一列,跳過 8 個位元組 -
Array strides: (24, 8)
NumPy 步長的工作原理
步長是根據陣列的形狀和資料型別計算的。對於給定的維度,步長是元素大小(以位元組為單位)和後續維度中元素數量的乘積。
對於形狀為(m, n) 且資料型別為dtype 的二維陣列 -
- 第一維度的步長:stride[0] = n * size_of(dtype)
- 第二維度的步長:stride[1] = size_of(dtype)
示例:基本步長
在下面的示例中,我們訪問基本一維 NumPy 陣列的步長 -
import numpy as np # Creating a 1D array array_1d = np.array([1, 2, 3, 4, 5]) # Accessing strides print("1D Array strides:", array_1d.strides)
步長 (8,) 表示每個元素在記憶體中相隔 8 個位元組,這對於整數陣列來說很常見 -
1D Array strides: (8,)
示例:更改步長
轉置陣列會更改步長,反映新的記憶體佈局,如下面的示例所示 -
import numpy as np # Creating a 2D array array_2d = np.array([[1, 2, 3], [4, 5, 6]]) # Transposing the array array_2d_T = array_2d.T # Accessing strides print("Original array strides:", array_2d.strides) print("Transposed array strides:", array_2d_T.strides)
步長 (8,) 表示每個元素在記憶體中相隔 8 個位元組,這對於整數陣列來說很常見 -
Original array strides: (24, 8) Transposed array strides: (8, 24)
示例:使用步長最佳化記憶體
使用步長可以透過允許高效的訪問模式來幫助最佳化記憶體使用 -
import numpy as np # Creating a large array large_array = np.zeros((1000, 1000)) # Accessing every 10th row strided_array = large_array[::10, :] print("Strided array shape:", strided_array.shape) print("Strided array strides:", strided_array.strides)
步長表示我們正在跳過 80,000 個位元組(10 行)以訪問下一行,從而最佳化記憶體訪問 -
Strided array shape: (100, 1000) Strided array strides: (80000, 8)
多維陣列中的步長
多維陣列中的步長工作方式類似,每個步長值表示相應維度的位元組步長。
對於多維陣列,每個維度的步長是元素大小與後續維度大小的累積乘積的乘積。
這意味著最後一維的步長只是資料型別的大小,倒數第二維的步長是最後一維的大小乘以資料型別的大小,依此類推。
示例
在下面的示例中,我們計算三維陣列的步長 -
import numpy as np # Creating a 3D array array_3d = np.zeros((2, 3, 4)) # Accessing strides print("3D Array strides:", array_3d.strides)
獲得的步長顯示了每個維度的位元組步長 -
3D Array strides: (96, 32, 8)
切片操作的步長
在執行 NumPy 陣列的切片操作時,步長非常有用。當您對 NumPy 陣列進行切片時,通常會建立一個數組的檢視而不是副本。此檢視共享相同的基礎資料,但可能具有不同的形狀或記憶體佈局。
步長決定在記憶體中跨越多少位元組才能沿著每個維度從一個元素移動到下一個元素。透過調整步長,您可以有效地訪問特定模式的資料。
NumPy 中的切片操作允許您提取陣列的子集,從單個元素到特定部分,而無需複製基礎資料。
示例
在此示例中,我們建立了一個大型二維陣列,並使用帶步長的切片操作訪問每第 10 行,而無需複製資料 -
import numpy as np # Creating a large 2D array large_array = np.arange(10000).reshape((100, 100)) # Accessing every 10th row strided_array = large_array[::10, :] print("Original array shape:", large_array.shape) print("Strided array shape:", strided_array.shape) print("Strided array strides:", strided_array.strides)
以下是獲得的輸出 -
Original array shape: (100, 100) Strided array shape: (10, 100) Strided array strides: (4000, 40)