
- 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 中迭代陣列是指以系統的方式逐個訪問陣列中每個元素的過程。這通常使用迴圈來完成。迭代用於對每個元素執行操作,例如計算、修改或檢查。
NumPy 提供了幾種迭代陣列的方法:
- 使用 for 迴圈
- 使用 'nditer()' 迭代器物件
- 扁平迭代
- 迭代順序
- 控制迭代順序
- 廣播迭代
- 使用向量化操作
- 外部迴圈
- 修改陣列值
使用 for 迴圈
在 NumPy 中,您可以使用基本的 Python **for 迴圈**來迭代陣列。for 迴圈是一種控制流語句,用於迭代序列(例如列表、元組、字典、集合或字串)。它允許您為序列中的每個元素重複執行一段程式碼。
迭代一維陣列
一維陣列基本上是元素的列表。迭代它很簡單,類似於迭代常規 Python 列表。
示例
在下面的示例中,我們從元素列表建立一個 NumPy 陣列,並使用 for 迴圈迭代每個元素:
import numpy as np # Create a 1-dimensional NumPy array arr = np.array([1, 2, 3, 4, 5]) # Iterate over the array for element in arr: print(element)
以下是獲得的輸出:
1 2 3 4 5
迭代多維陣列
NumPy 陣列可以具有任意數量的維度,通常稱為軸。例如:
- 一維陣列是元素的列表。
- 二維陣列類似於具有行和列的矩陣。
- 三維陣列可以視覺化為二維矩陣的集合。
示例:迭代二維陣列
當迭代二維陣列時,每次迭代都訪問陣列的一整行,如下面的示例所示:
import numpy as np # Create a 2D NumPy array (3x3 matrix) arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # Iterate over the array for row in arr_2d: print(row)
這將產生以下結果:
[1 2 3] [4 5 6] [7 8 9]
示例:迭代三維陣列
當迭代三維陣列時,每次迭代都訪問一個完整的二維子陣列(矩陣),如下面的示例所示:
import numpy as np # Create a 3D NumPy array (2x2x3) arr_3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]) # Iterate over the array for matrix in arr_3d: print(matrix)
以下是上述程式碼的輸出:
[[1 2 3] [4 5 6]] [[ 7 8 9] [10 11 12]]
迭代多維陣列中的元素
迭代 NumPy 中多維陣列中的元素是一種訪問每個單獨元素的方式,而不管陣列的維度如何。此過程需要巢狀迴圈來遍歷陣列結構的每個維度。
示例
在此示例中,我們使用巢狀迴圈來迭代每一行 (i) 和每一列 (j),使用索引訪問和列印每個元素:
import numpy as np # Create a 2-dimensional NumPy array arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # Iterating over elements in the 2D array # Iterate over rows for i in range(arr_2d.shape[0]): # Iterate over columns for j in range(arr_2d.shape[1]): print(arr_2d[i, j])
獲得的輸出如下所示:
1 2 3 4 5 6 7 8 9
使用索引迭代
使用索引迭代 NumPy 陣列用於透過陣列每個維度內的特定位置訪問陣列元素。
在 NumPy 中,陣列的索引從每個維度的 **0** 開始。使用索引迭代涉及使用巢狀迴圈遍歷陣列的每個維度,並使用其特定索引訪問元素。
與簡單的元素迭代相比,這種方法允許更精確地控制元素訪問和操作。
示例
在下面的示例中,我們使用巢狀迴圈迭代二維陣列的每個元素。我們訪問並列印每個元素的值及其索引:
import numpy as np # Create a 2-dimensional NumPy array arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # Get the dimensions of the array rows, cols = arr_2d.shape # Iterate over the array using indices for i in range(rows): for j in range(cols): print(f"Element at ({i}, {j}): {arr_2d[i, j]}")
執行上述程式碼後,我們得到以下輸出:
Element at (0, 0): 1 Element at (0, 1): 2 Element at (0, 2): 3 Element at (1, 0): 4 Element at (1, 1): 5 Element at (1, 2): 6 Element at (2, 0): 7 Element at (2, 1): 8 Element at (2, 2): 9
使用 'nditer' 迭代器物件
NumPy 中的 **nditer()** 函式提供了一個高效的多維迭代器物件,可用於迭代陣列的元素。它使用 Python 的標準迭代器介面訪問陣列的每個元素。
示例
在此示例中,nditer() 函式用於以扁平化的順序迭代陣列“arr”的所有元素,依次列印每個元素:
import numpy as np # Example array arr = np.array([[1, 2], [3, 4]]) # Iterate using nditer for x in np.nditer(arr): print(x)
產生的結果如下:
1234
扁平迭代
扁平迭代是指迭代多維陣列的所有元素,就好像它是一維陣列一樣。當您需要處理或運算元組中的每個元素而無需顯式考慮其原始形狀或維度時,此方法很有用。
示例
在此示例中,我們正在建立一個二維 NumPy 陣列。然後,我們使用帶有“buffered”標誌的 np.nditer 以扁平化的順序迭代此陣列,依次列印每個元素:
import numpy as np # Create a 2D array arr = np.array([[1, 2, 3], [4, 5, 6]]) # Flat iteration using nditer with 'buffered' flag print("Iterating over the array:") for x in np.nditer(arr, flags=['buffered']): print(x, end=' ')
我們得到如下所示的輸出:
Iterating over the array: 1 2 3 4 5 6
迭代順序
NumPy 中的迭代順序是指在迭代期間訪問陣列元素的順序。預設情況下,NumPy 陣列以 **行優先** 順序迭代,也稱為 **C 風格** 順序。
這意味著對於多維陣列,迭代從第一個維度(行)開始,沿著最後一個維度(列)迭代所有元素。
示例
在此示例中,我們使用 numpy.nditer() 函式迭代陣列,以預設的行優先順序(C 風格)訪問每個元素,並依次列印它們:
import numpy as np # Create a 2D array arr = np.array([[1, 2, 3], [4, 5, 6]]) # Iterate over the array print("Default Iteration Order (C-style, row-major):") for x in np.nditer(arr): print(x, end=' ')
以下是獲得的輸出:
Default Iteration Order (C-style, row-major): 1 2 3 4 5 6
控制迭代順序
控制 NumPy 中的迭代順序允許您指定在迭代期間訪問陣列元素的方式。NumPy 提供了根據記憶體佈局和效能考慮因素控制迭代順序的選項:
**Fortran 風格順序 -** 按列迭代元素(列優先順序)。
for x in np.nditer(arr, order='F'): ...
**外部迴圈 -** 在迭代外部維度時保持內部維度完整。
for row in np.nditer(arr, flags=['external_loop']): ...
示例
在此示例中,我們使用 numpy.nditer() 函式迭代陣列,以 Fortran 風格順序(F 風格)訪問每個元素:
import numpy as np # array arr = np.array([[1, 2], [3, 4]]) # Iterate in specified order (F-style) for x in np.nditer(arr, order='F'): print(x)
這將產生以下結果:
1 3 2 4
廣播迭代
NumPy 中的廣播迭代是指同時迭代多個數組,其中陣列被廣播以具有相容的形狀。
這允許元素級運算在陣列之間高效地應用,而無需顯式對齊其維度。
示例
在下面的示例中,我們透過同時迭代兩個陣列 arr1 和 arr2 來演示 NumPy 中的廣播迭代。
使用 nditer() 函式對“arr1”和“arr2”中每個對應元素求和,顯示元素級運算,無需顯式對齊陣列維度:
import numpy as np # arrays arr1 = np.array([1, 2, 3]) arr2 = np.array([10, 20, 30]) # Broadcasting addition operation print("Broadcasting Iteration:") for x, y in np.nditer([arr1, arr2]): print(x + y, end=' ')
以下是上述程式碼的輸出:
Broadcasting Iteration: 11 22 33
使用向量化操作
NumPy 中的向量化運算是指一次對整個陣列執行運算,而不是迭代單個元素。
示例
在下面的示例中,我們透過對兩個陣列 arr1 和 arr2 執行元素級加法來演示 NumPy 中的向量化運算。這隻需在陣列之間使用 **+** 運算子即可實現:
import numpy as np # Example arrays arr1 = np.array([1, 2, 3, 4]) arr2 = np.array([10, 20, 30, 40]) # Vectorized addition operation result = arr1 + arr2 print("Vectorized Operations:") print("Result of addition:", result)
獲得的輸出如下所示:
Vectorized Operations:Result of addition: [11 22 33 44]
外部迴圈
在 NumPy 中,“外部迴圈”的概念是指在迭代陣列時保持某些維度完整。這允許您迭代具有巢狀結構的陣列,而無需將內部維度摺疊成單個序列。
**numpy.nditer()** 函式在與 **external_loop** 標誌一起使用時,允許在保留陣列行結構的同時迭代陣列元素。這確保每行都被單獨處理,演示了整個迭代過程中維度的完整性是如何保持的。
示例
在下面的示例中,我們透過迭代二維陣列來說明 NumPy 中的外部迴圈迭代:
import numpy as np # array with multiple dimensions arr = np.array([[1, 2, 3], [4, 5, 6]]) # External loop iteration print("External Loop:") for row in np.nditer(arr, flags=['external_loop']): print(row)
執行上述程式碼後,我們得到以下輸出:
External Loop:[1 2 3 4 5 6]
修改陣列值
修改 NumPy 中的陣列值用於直接為陣列內的特定元素或切片分配新值。這有助於就地更新資料,而無需重新建立整個陣列。
**nditer** 物件還有另一個可選引數稱為 **op_flags**。它的預設值為只讀,但可以設定為讀寫或只寫模式。這將啟用使用此迭代器修改陣列元素。
示例
在下面的示例中,我們使用 nditer() 函式修改 NumPy 中的陣列值。透過將“op_flags”引數設定為“readwrite”,迭代器將陣列 arr 的每個元素乘以 2:
import numpy as np # Create a 1D array arr = np.array([1, 2, 3, 4, 5]) # Modify array elements with np.nditer(arr, flags=['buffered'], op_flags=['readwrite']) as it: for x in it: # Multiply each element by 2 x[...] = x * 2 print("Modified Array Example:",arr)
產生的結果如下:
Modified Array Example: [ 2 4 6 8 10]