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]
廣告