NumPy 是 Python 資料科學領域的核心函式庫,其高效的陣列運算能力是許多科學計算的基礎。理解如何建立和操作多維陣列,特別是對角線元素,對於資料處理和分析至關重要。本文將介紹使用 zeros
、ones
、full
初始化不同值的多維陣列,使用 eye
函式建立單位矩陣,以及使用 diag
函式提取和建構對角陣列等技巧。這些函式的靈活運用能大幅提升程式碼效率,簡化複雜的陣列操作。尤其在機器學習、影像處理等領域,這些技巧更是不可或缺。
初始化 4 維陣列
以下是使用 zeros
函式初始化一個 4 維陣列的例子:
import numpy as np
# 初始化 4 維陣列,形狀為 (3, 1, 2, 3)
array = np.zeros((3, 1, 2, 3))
print(array)
輸出結果:
[[[0. 0. 0.]
[0. 0. 0.]]
[[0. 0. 0.]
[0. 0. 0.]]
[[0. 0. 0.]
[0. 0. 0.]]]
如您所見,輸出結果是一個 4 維陣列,形狀為 (3, 1, 2, 3)。每個元素都是 0。
內容解密:
np.zeros
函式用於建立多維陣列,並將所有元素初始化為 0。(3, 1, 2, 3)
是陣列的形狀,代表著 4 個維度的大小。print(array)
用於輸出陣列的內容。
多維陣列的結構
多維陣列可以想象成一個矩陣的矩陣。每個維度代表著一個新的矩陣。例如,在上面的例子中,我們有一個 3x1x2x3 的陣列,可以想象成:
- 一個 3x1 的矩陣,每個元素都是一個 2x3 的矩陣。
- 每個 2x3 的矩陣,又包含了 2x3 個元素,每個元素都是一個數值。
這樣的結構使得多維陣列可以用來表示複雜的資料結構,例如影像、音訊等。
圖表翻譯:
graph LR A[3x1] --> B[2x3] B --> C[數值] C --> D[0]
這個圖表展示了多維陣列的結構。每個節點代表著一個維度,箭頭代表著維度之間的關係。最終,所有維度都指向了數值 0。
NumPy 中的 ones() 函式
NumPy 的 ones() 函式用於建立一個指定形狀和資料型別的陣列,並將所有元素初始化為 1。這個函式的行為與 zeros() 函式相似,不同之處在於它傳回的陣列中所有元素都是 1。
示例程式碼
import numpy as np
# 建立 1-D 陣列
print(np.ones(4))
print('-'*50)
# 建立 2-D 陣列
print(np.ones((4,2), dtype=int))
print('-'*50)
# 建立 3-D 陣列
print(np.ones((3,2,4), dtype=int))
執行結果
[1. 1. 1. 1.]
--------------------------------------------------
[[1 1]
[1 1]
[1 1]
[1 1]]
--------------------------------------------------
[[[1 1 1 1]
[1 1 1 1]]
[[1 1 1 1]
[1 1 1 1]]
[[1 1 1 1]
[1 1 1 1]]]
圖表翻譯
flowchart TD A[開始] --> B[建立陣列] B --> C[指定形狀和資料型別] C --> D[初始化元素為 1] D --> E[傳回陣列]
圖表翻譯:
上述流程圖描述了 ones() 函式的執行過程。首先,函式被呼叫以建立一個陣列。接下來,指定陣列的形狀和資料型別。然後,函式將陣列中的所有元素初始化為 1。最後,函式傳回建立的陣列。
內容解密:
ones() 函式是 NumPy 中的一個重要函式,用於建立初始化為 1 的陣列。這個函式可以用於建立不同維度的陣列,包括 1-D、2-D 和 3-D 陣列。透過指定形狀和資料型別,使用者可以控制建立的陣列的結構和內容。這個函式在科學計算和資料分析中非常有用,因為它可以快速建立初始化為 1 的陣列,以便進行進一步的計算和分析。
使用NumPy的full()函式建立新陣列
NumPy的full()
函式是一個強大的工具,允許您建立具有指定形狀和資料型別的新陣列,並用特定的填充值填充。以下是如何使用它的示例:
import numpy as np
# 建立一個2x2的陣列,填充值為1
array_2x2 = np.full((2, 2), 1)
print(array_2x2)
輸出:
[[1 1]
[1 1]]
# 建立一個4x2的陣列,填充值為1
array_4x2 = np.full((4, 2), 1)
print(array_4x2)
輸出:
[[1 1]
[1 1]
[1 1]
[1 1]]
# 建立一個3x2的3D陣列,填充值為1
array_3d = np.full((3, 2, 2), 1)
print(array_3d)
輸出:
[[[1 1]
[1 1]]
[[1 1]
[1 1]]
[[1 1]
[1 1]]]
要了解full()
函式的引數和功能,您可以使用help()
函式:
import numpy as np
print(help(np.full))
這將顯示full()
函式的檔案,包括其引數和傳回值。
full()函式的引數
shape
: 陣列的形狀,必須是一個整數元組。fill_value
: 填充值,可以是任何資料型別。dtype
: 陣列的資料型別,預設為None
,表示使用fill_value
的資料型別。order
: 陣列的記憶體佈局,預設為'C'
,表示C語言風格的行優先。like
: 可選引數,指定一個現有的陣列,用於確定新陣列的資料型別和記憶體佈局。
建立多維陣列
NumPy 提供了 full
函式,用於建立具有指定形狀和填充值的多維陣列。以下示範如何建立 1-D、2-D 和 3-D 陣列。
建立 1-D 陣列
首先,我們建立一個 1-D 陣列,長度為 4,所有元素的值均為 2。
import numpy as np
# 建立 1-D 陣列
array_1d = np.full(shape=4, fill_value=2)
print(array_1d)
輸出結果:
[2 2 2 2]
建立 2-D 陣列
接下來,我們建立一個 2-D 陣列,大小為 3x2,所有元素的值均為 2。
# 建立 2-D 陣列
array_2d = np.full((3, 2), fill_value=2)
print(array_2d)
輸出結果:
[[2 2]
[2 2]
[2 2]]
建立 3-D 陣列
最後,我們建立一個 3-D 陣列,大小為 3x2x3,所有元素的值均為 2。
# 建立 3-D 陣列
array_3d = np.full((3, 2, 3), 2)
print(array_3d)
輸出結果:
[[[2 2 2]
[2 2 2]]
[[2 2 2]
[2 2 2]]
[[2 2 2]
[2 2 2]]]
內容解密:
np.full
函式用於建立具有指定形狀和填充值的多維陣列。shape
引數指定了陣列的形狀,可以是整數或元組。fill_value
引數指定了陣列中所有元素的值。- 建立多維陣列時,可以使用元組指定形狀,例如
(3, 2)
或(3, 2, 3)
。
使用 NumPy 的 eye 函式生成單位矩陣
NumPy 的 eye
函式可以用來生成單位矩陣(identity matrix),它是一個 2D 陣列,其中對角線上的元素為 1,其他元素為 0。
eye 函式的語法
eye
函式的語法如下:
numpy.eye(N, M=None, k=0, dtype=<class 'float'>, order='C', *, like=None)
其中:
N
:輸出矩陣的行數。M
:輸出矩陣的列數。如果省略,則預設為N
。k
:指定哪一條對角線應該填充 1。預設值為 0,即主對角線。dtype
:輸出矩陣的資料型別。預設為float
。order
:輸出矩陣的儲存順序。預設為'C'
,即 C 語言的儲存順序。
示例程式碼
以下程式碼示範瞭如何使用 eye
函式生成單位矩陣:
import numpy as np
# 建立一個 2x4 的單位矩陣
print(np.eye(2, 4))
# 建立一個 5x5 的單位矩陣,對角線向右偏 1 個位置
print(np.eye(5, k=1))
# 建立一個 5x5 的單位矩陣,對角線向右偏 2 個位置
print(np.eye(5, k=2))
# 建立一個 5x5 的單位矩陣,對角線向左偏 1 個位置
print(np.eye(5, k=-1))
內容解密:
在上述程式碼中,我們使用 eye
函式生成了四個不同的單位矩陣。首先,我們建立了一個 2x4 的單位矩陣,然後建立了三個 5x5 的單位矩陣,分別將對角線向右偏 1 個位置、向右偏 2 個位置和向左偏 1 個位置。
這些矩陣可以用於線性代數和矩陣運算中,例如解方程組、計算行列式等。
圖表翻譯:
以下是使用 Mermaid 圖表語言繪製的 eye 函式生成單位矩陣的流程圖:
flowchart TD A[開始] --> B[輸入引數 N、M、k] B --> C[生成單位矩陣] C --> D[傳回結果] D --> E[結束]
在這個流程圖中,我們首先輸入引數 N
、M
和 k
,然後使用 eye
函式生成單位矩陣,最後傳回結果。
建立二維陣列的 eye 函式
在 NumPy 中,eye
函式用於建立一個二維陣列,其中主對角線(或指定的對角線)上的元素為 1,其他元素為 0。這個函式在建立單位矩陣或其他特殊矩陣時非常有用。
基本語法
numpy.eye(N, k=0, dtype=None)
N
:輸出陣列的行數和列數。k
:對角線的索引。0 表示主對角線,正值表示上對角線,負值表示下對角線。dtype
:輸出陣列的資料型別。
示例 1:建立主對角線為 1 的 5x5 陣列
import numpy as np
# 建立 5x5 陣列,主對角線為 1
array = np.eye(5)
print(array)
輸出結果:
[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]
示例 2:建立下對角線為 1 的 5x5 陣列
import numpy as np
# 建立 5x5 陣列,下對角線(k=-1)為 1
array = np.eye(5, k=-1)
print(array)
輸出結果:
[[0. 0. 0. 0. 0.]
[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]]
示例 3:建立下兩條對角線為 1 的 5x5 陣列
import numpy as np
# 建立 5x5 陣列,下兩條對角線(k=-1 和 k=-2)為 1
array_k1 = np.eye(5, k=-1)
array_k2 = np.eye(5, k=-2)
print("下一條對角線(k=-1)為 1:")
print(array_k1)
print("\n下兩條對角線(k=-2)為 1:")
print(array_k2)
輸出結果:
下一條對角線(k=-1)為 1:
[[0. 0. 0. 0. 0.]
[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]]
下兩條對角線(k=-2)為 1:
[[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
圖表翻譯:
graph LR A[eye 函式] --> B[主對角線 k=0] A --> C[下對角線 k=-1] A --> D[下兩條對角線 k=-2] B --> E[5x5 陣列,主對角線為 1] C --> F[5x5 陣列,下一條對角線為 1] D --> G[5x5 陣列,下兩條對角線為 1]
這個圖表展示瞭如何使用 eye
函式建立不同型別的二維陣列,包括主對角線、下一條對角線和下兩條對角線為 1 的陣列。
使用 diag() 函式
在進行矩陣運算時,經常需要提取或建構對角陣列。為此,NumPy 提供了 diag()
函式。這個函式可以用來提取矩陣的對角元素,或根據給定的對角元素建構一個對角陣列。
提取對角元素
當你想要從一個矩陣中提取對角元素時,可以使用 diag()
函式。這個函式會傳回矩陣的主對角線上的元素。
import numpy as np
# 定義一個矩陣
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 提取對角元素
diagonal_elements = np.diag(matrix)
print(diagonal_elements)
建構對角陣列
如果你有一組對角元素,想要根據它們建構一個對角陣列,也可以使用 diag()
函式。這個函式會根據給定的對角元素,建構一個對應的對角陣列。
import numpy as np
# 定義一組對角元素
diagonal_elements = np.array([1, 2, 3])
# 建構對角陣列
diagonal_matrix = np.diag(diagonal_elements)
print(diagonal_matrix)
內容解密:
np.diag()
函式是用來提取或建構對角陣列的。- 當你傳入一個矩陣給
np.diag()
時,它會傳回該矩陣的主對角線上的元素。 - 如果你傳入一維陣列給
np.diag()
,它會根據這些元素建構一個對角陣列。 - 這個函式在矩陣運算中非常有用,尤其是在需要處理對角元素或建構特殊矩陣的場合。
圖表翻譯:
flowchart TD A[定義矩陣或對角元素] --> B[使用 np.diag()] B --> C[提取或建構對角陣列] C --> D[傳回結果]
在這個流程圖中,我們首先定義一個矩陣或一組對角元素,然後使用 np.diag()
函式進行提取或建構,最後傳回結果。這個過程展示瞭如何使用 diag()
函式來操作對角元素或陣列。
使用NumPy的diag()函式提取二維陣列的對角線元素
在進行資料分析和矩陣運算時,經常需要提取二維陣列的對角線元素。NumPy提供了一個方便的函式diag()
來完成這項工作。
diag()函式的語法
diag(v, k=0)
v
:輸入陣列,可以是一維或二維陣列。k
:對角線的索引,預設為0,代表主對角線。
範例程式
import numpy as np
# 建立一個4x4的二維陣列
my_array = np.arange(17, 33).reshape(4, 4)
print("原始二維陣列:\n", my_array)
# 提取主對角線元素(k=0)
print("主對角線元素:", np.diag(my_array, k=0))
# 提取1對角線元素(k=1)
print("1對角線元素:", np.diag(my_array, k=1))
# 提取2對角線元素(k=2)
print("2對角線元素:", np.diag(my_array, k=2))
# 提取-1對角線元素(k=-1)
print("-1對角線元素:", np.diag(my_array, k=-1))
# 提取-2對角線元素(k=-2)
print("-2對角線元素:", np.diag(my_array, k=-2))
# 提取3對角線元素(k=3)
print("3對角線元素:", np.diag(my_array, k=3))
執行結果
原始二維陣列:
[[17 18 19 20]
[21 22 23 24]
[25 26 27 28]
[29 30 31 32]]
主對角線元素: [17 22 27 32]
1對角線元素: [18 23 28]
2對角線元素: [19 24]
-1對角線元素: [21 26 31]
-2對角線元素: [25 30]
3對角線元素: [20]
使用NumPy的diag()函式提取矩陣對角線元素
NumPy的diag()函式可以用來提取矩陣的對角線元素,或是根據給定的偏移量提取指定對角線的元素。以下是如何使用diag()函式的示例:
提取主對角線元素
import numpy as np
# 建立一個2維矩陣
my_array = np.array([[17, 18, 19, 20], [21, 22, 23, 24]])
# 提取主對角線元素(k=0)
main_diagonal = np.diag(my_array)
print("主對角線元素:", main_diagonal)
提取其他對角線元素
# 提取k=3對角線元素
k3_diagonal = np.diag(my_array, k=3)
print("k=3對角線元素:", k3_diagonal)
# 提取k=-3對角線元素
km3_diagonal = np.diag(my_array, k=-3)
print("k=-3對角線元素:", km3_diagonal)
對1維陣列使用diag()函式
當對1維陣列使用diag()函式時,會根據給定的偏移量構建一個2維陣列,並填充剩餘的元素為零。
# 建立一個1維陣列
my_array1d = np.array([101, 201, 301, 401, 501])
# 使用diag()函式構建2維陣列,k=0
array_k0 = np.diag(my_array1d)
print("k=0的2維陣列:\n", array_k0)
# 使用diag()函式構建2維陣列,k=1
array_k1 = np.diag(my_array1d, k=1)
print("k=1的2維陣列:\n", array_k1)
# 使用diag()函式構建2維陣列,k=-1
array_km1 = np.diag(my_array1d, k=-1)
print("k=-1的2維陣列:\n", array_km1)
圖表翻譯:
flowchart TD A[輸入矩陣] --> B[選擇偏移量k] B --> C{是否為1維陣列} C -->|是| D[構建2維陣列] C -->|否| E[提取對角線元素] D --> F[填充剩餘元素為零] E --> G[傳回對角線元素] F --> G
圖表說明:
上述流程圖描述了使用NumPy的diag()函式提取矩陣對角線元素的過程。根據輸入的矩陣和偏移量k,diag()函式會決定是否需要構建一個新的2維陣列或直接提取對角線元素。如果是1維陣列,則會根據給定的偏移量構建一個2維陣列,並填充剩餘的元素為零。最終,diag()函式會傳回所需的對角線元素。
從底層實作到高階應用的全面檢視顯示,NumPy 提供了多元且有效率的工具來建立和操作多維陣列。透過 zeros()
、ones()
和 full()
函式,我們可以快速初始化不同形狀和資料型別的陣列,奠定數值計算的基礎。eye()
和 diag()
函式則賦予我們精確控制矩陣對角線元素的能力,簡化了單位矩陣和對角矩陣的建立與操作,線上性代數和矩陣運算中扮演關鍵角色。觀察產業鏈上下游的技術選擇,NumPy 已成為科學計算和資料分析領域不可或缺的基本。對於追求效能和程式碼簡潔性的開發者,熟練掌握這些陣列操作技巧至關重要。玄貓認為,持續深入探索 NumPy 的豐富功能,將有效提升開發效率並開啟更多資料處理的可能性。