NumPy 是 Python 資料科學領域的核心函式庫,提供高效能的多維陣列物件 ndarray 以及用於處理這些陣列的工具。理解 ndarray 的屬性和運算是進行數值計算的基礎。本文將詳細介紹如何建立 NumPy 陣列、檢視其屬性,並示範基本的陣列運算和廣播機制,以及如何使用 reshape、resize 和 flatten 方法操作陣列形狀和維度。這些操作是資料科學、機器學習等領域的基本,能有效處理和分析大量數值資料。透過瞭解這些基本操作,開發者可以更有效率地運用 NumPy 進行資料處理和分析。
瞭解 NumPy 陣列的屬性和運算
在這個範例中,我們將探討如何使用 NumPy 建立陣列、瞭解其屬性(維度、大小和形狀),以及如何進行基本的陣列運算。
建立 NumPy 陣列
首先,我們建立兩個 NumPy 陣列:myarr1
和 myarr2
。myarr1
是一個 2x3 的陣列,包含整數值;而 myarr2
是透過 arange
函式建立的,從 21 到 26,reshape 成 2x3 的陣列。
import numpy as np
myarr1 = np.array([[21, 31, 41], [52, 62, 72]])
myarr2 = np.arange(21, 27).reshape(2, 3)
瞭解 NumPy 陣列的屬性
接下來,我們印出 myarr1
和 myarr2
的維度(ndim)、大小(size)和形狀(shape)。
print(f"Dimension of myarr1 is : {myarr1.ndim}, size of myarr1 is :{myarr1.size} and shape of myarr1 is : {myarr1.shape}")
print(f"Dimension of myarr2 is : {myarr2.ndim}, size of myarr2 is :{myarr2.size} and shape of myarr2 is : {myarr2.shape}")
印出 NumPy 陣列
然後,我們簡單地印出 myarr1
和 myarr2
的內容。
print(f'Numpy array 1 is: {myarr1}')
print(f'Numpy array 2 is: {myarr2}')
基本陣列運算
現在,我們進行基本的陣列運算:加法、減法、乘法和除法。這些運算是元素對元素的,也就是說,對應位置的元素會進行相同的運算。
print('-'*50)
print(f"Addition of 2 numpy arrays is {np.add(myarr1, myarr2)}")
print('-'*50)
print(f"Subtraction of 2 numpy arrays is {np.subtract(myarr1, myarr2)}")
print('-'*50)
print(f"Multiplication of 2 numpy arrays is {np.multiply(myarr1, myarr2)}")
print('-'*50)
print(f"Division of 2 numpy arrays is {np.divide(myarr1, myarr2)}")
圖表翻譯:
flowchart TD A[建立陣列] --> B[印出陣列屬性] B --> C[印出陣列內容] C --> D[進行陣列運算] D --> E[加法] D --> F[減法] D --> G[乘法] D --> H[除法]
內容解密:
- 建立 NumPy 陣列可以使用
np.array()
函式。 - 可以使用
ndim
、size
和shape
屬性來瞭解陣列的維度、大小和形狀。 - 基本的陣列運算(加法、減法、乘法和除法)可以使用對應的 NumPy 函式進行,例如
np.add()
、np.subtract()
、np.multiply()
和np.divide()
。
瞭解NumPy陣列運算
NumPy(Numerical Python)是一個強大的Python函式庫,主要用於數值計算。它提供了多維陣列和矩陣,以及一系列運算這些陣列的函式。
建立NumPy陣列
首先,我們需要建立兩個NumPy陣列:myarr1
和myarr2
。
import numpy as np
# 建立NumPy陣列
myarr1 = np.array([[21, 31, 41], [52, 62, 72]])
myarr2 = np.array([[21, 22, 23], [24, 25, 26]])
陣列屬性
接下來,我們可以檢視陣列的屬性,例如維度、大小和形狀。
# 檢視陣列屬性
print(f"Dimension of myarr1 is : {myarr1.ndim}, size of myarr1 is :{myarr1.size} and shape of myarr1 is : {myarr1.shape}")
print(f"Dimension of myarr2 is : {myarr2.ndim}, size of myarr2 is :{myarr2.size} and shape of myarr2 is : {myarr2.shape}")
陣列運算
現在,我們可以進行陣列運算,例如加法、減法、乘法、除法、模數和次方。
# 進行加法
print(f"Addition of 2 numpy arrays is {np.add(myarr1, myarr2)}")
# 進行減法
print(f"Subtraction of 2 numpy arrays is {np.subtract(myarr1, myarr2)}")
# 進行乘法
print(f"Multiplication of 2 numpy arrays is {np.multiply(myarr1, myarr2)}")
# 進行除法
print(f"Division of 2 numpy arrays is {np.divide(myarr1, myarr2)}")
# 進行floor除法
print(f"Floor division of 2 numpy arrays is {np.floor_divide(myarr1, myarr2)}")
# 進行模數運算
print(f"Modulus of 2 numpy arrays is {np.mod(myarr1, myarr2)}")
# 進行次方運算
print(f"Power of 2 numpy arrays is {np.power(myarr1, myarr2)}")
Mermaid圖表:陣列運算流程
flowchart TD A[建立NumPy陣列] --> B[檢視陣列屬性] B --> C[進行陣列運算] C --> D[加法、減法、乘法、除法、floor除法、模數和次方] D --> E[輸出結果]
圖表翻譯:
上述Mermaid圖表展示了NumPy陣列運算的流程。首先,建立兩個NumPy陣列。接下來,檢視陣列的屬性。然後,進行陣列運算,包括加法、減法、乘法、除法、floor除法、模數和次方。最後,輸出結果。
內容解密:
上述程式碼展示瞭如何使用NumPy進行陣列運算。首先,匯入NumPy函式庫並建立兩個NumPy陣列。接下來,檢視陣列的屬性,包括維度、大小和形狀。然後,進行陣列運算,包括加法、減法、乘法、除法、floor除法、模數和次方。每個運算都使用了NumPy的函式,例如np.add()
、np.subtract()
、np.multiply()
等。最後,輸出結果。
NumPy陣列運算與廣播機制
NumPy是一個強大的Python函式庫,提供了高效的數值運算功能,特別是在陣列運算方面。當進行陣列運算時,NumPy提供了多種運運算元,可以對陣列進行基本的算術運算,如加、減、乘、除等。此外,NumPy還提供了廣播(Broadcasting)機制,允許不同形狀的陣列之間進行運算。
基本陣列運算
在NumPy中,基本的陣列運算包括加、減、乘、除等。以下是幾個例子:
import numpy as np
# 定義兩個陣列
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[7, 8, 9], [10, 11, 12]])
# 加法運算
result_add = arr1 + arr2
print("加法運算結果:\n", result_add)
# 減法運算
result_sub = arr1 - arr2
print("減法運算結果:\n", result_sub)
# 乘法運算
result_mul = arr1 * arr2
print("乘法運算結果:\n", result_mul)
# 除法運算
result_div = arr1 / arr2
print("除法運算結果:\n", result_div)
廣播機制
廣播機制是NumPy的一個重要特性,允許不同形狀的陣列之間進行運算。當兩個陣列的形狀不相同時,NumPy會自動進行廣播,以使得兩個陣列可以進行運算。
以下是廣播機制的幾個關鍵點:
- 當兩個陣列的形狀不相同時,NumPy會自動進行廣播。
- 廣播是根據陣列的形狀和大小進行的。
- 不是所有的情況都適合廣播。
廣播規則
廣播規則如下:
- 如果兩個陣列的形狀相同,則可以直接進行運算。
- 如果兩個陣列的形狀不相同,但有一個陣列的形狀為1,則可以進行廣播。
- 如果兩個陣列的形狀不相同,並且沒有有一個陣列的形狀為1,則不能進行廣播。
以下是幾個例子:
import numpy as np
# 定義兩個陣列
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([7, 8, 9])
# 加法運算
result_add = arr1 + arr2
print("加法運算結果:\n", result_add)
# 定義兩個陣列
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([7])
# 加法運算
result_add = arr1 + arr2
print("加法運算結果:\n", result_add)
NumPy中的廣播機制
NumPy中的廣播機制是一種強大的工具,允許使用者對不同形狀和大小的陣列進行運算。這種機制在進行算術運算時自動執行,當指定的規則滿足時。廣播機制的必要性在於處理不同維度、形狀或大小的陣列時。
廣播規則
廣播規則如下:
- 維度一致性:確保兩個陣列的維度相同。NumPy會調整陣列以使其具有相同的維度,如果最初不同。這種調整涉及在左側用1填充具有較少維度的陣列的形狀,直到兩個陣列具有相同的維度。
前 | 後 |
---|---|
(2,3) | (2,3) |
(3) | (1,3) |
例如,讓我們考慮兩個陣列:mynp1
具有形狀(2,3),是一個2D陣列,而mynp2
具有形狀(3),是一個1D陣列。這兩個陣列的維度不同,透過廣播機制,mynp2
陣列的形狀會被調整為(1,3)。
- 大小匹配:如果兩個陣列在任何維度上的大小不匹配,且有一個陣列在該維度上的大小為1,則會將大小為1的陣列擴充套件到另一個陣列的大小,以使其匹配。
前 | 後 |
---|---|
(2,3) | (2,3) |
(1,3) | (2,3) |
例如,mynp1
陣列具有形狀(2,3),而mynp2
陣列具有形狀(1,3)。透過廣播機制,mynp2
陣列的第一個座標(1)會被增加到mynp1
的大小(2),使得兩個陣列的形狀都變為(2,3)。
實際應用
如果在任何維度上,兩個陣列的大小都不相同且都不等於1,則會出現錯誤,因為NumPy無法對這些陣列進行廣播。
下面是一個示例程式,名為Chap2_Example2.25.py
,用於演示廣播概念:
import numpy as mynp
print("1-D陣列廣播--------------")
# 1-D陣列廣播
myarr1 = mynp.array([21, 22, 23])
這個程式建立了一個1D陣列myarr1
,並列印預出相關資訊。透過這個示例,我們可以更好地理解NumPy中的廣播機制及其應用。
內容解密:
上述程式碼建立了一個1D陣列myarr1
,其形狀為(3,)。如果我們想對這個陣列進行廣播,需要確保其維度和大小與另一個陣列匹配。透過廣播機制,NumPy可以自動調整陣列的形狀和大小,以使其滿足運算要求。
圖表翻譯:
flowchart TD A[建立1D陣列] --> B[廣播機制] B --> C[調整陣列形狀] C --> D[匹配大小] D --> E[進行運算]
這個流程圖描述了廣播機制的過程:建立1D陣列、啟動廣播機制、調整陣列形狀、匹配大小、進行運算。透過這個圖表,我們可以更清晰地理解廣播機制的工作原理。
NumPy陣列廣播(Broadcasting)機制
NumPy陣列廣播是一種強大的功能,允許您對不同形狀的陣列進行運算。當您對兩個陣列進行運算時,NumPy會自動將陣列廣播到相同的形狀,以便進行元素對元素的運算。
一維陣列廣播
首先,我們建立兩個一維陣列:myarr1
和myarr2
。myarr1
包含三個元素:21、22和23,而myarr2
只包含一個元素:10。
import numpy as np
myarr1 = np.array([21, 22, 23])
myarr2 = np.array([10])
print(f"myarr1 is {myarr1}")
print(f"myarr2 is {myarr2}")
當我們將myarr1
和myarr2
相加時,NumPy會自動將myarr2
廣播到與myarr1
相同的形狀,即[3]。這意味著myarr2
會被複製三次,以便與myarr1
的每個元素相加。
print(f"myarr1+myarr2 is: {myarr1+myarr2}")
結果是:
myarr1 is [21 22 23]
myarr2 is [10]
myarr1+myarr2 is: [31 32 33]
如您所見,myarr2
已被廣播到[10 10 10],以便與myarr1
的每個元素相加。
二維陣列廣播
現在,我們來看一下二維陣列的廣播。建立兩個二維陣列:myarr3
和myarr4
。myarr3
是一個2x3的陣列,而myarr4
是一個一維陣列,包含三個元素:10、12和13。
myarr3 = np.arange(21, 27).reshape(2, 3)
myarr4 = np.array([10, 12, 13])
print(f"myarr3 is {myarr3}")
print(f"myarr4 is {myarr4}")
當我們將myarr3
和myarr4
相加時,NumPy會自動將myarr4
廣播到與myarr3
相同的形狀,即[2, 3]。這意味著myarr4
會被複製兩次,以便與myarr3
的每行相加。
print(f"myarr3+myarr4 is: {myarr3+myarr4}")
結果是:
myarr3 is [[21 22 23]
[24 25 26]]
myarr4 is [10 12 13]
myarr3+myarr4 is: [[31 34 36]
[34 37 39]]
如您所見,myarr4
已被廣播到[[10 12 13], [10 12 13]],以便與myarr3
的每行相加。
圖表翻譯:
graph LR A[NumPy陣列廣播] --> B[一維陣列廣播] A --> C[二維陣列廣播] B --> D[myarr1 + myarr2] C --> E[myarr3 + myarr4] D --> F[結果:[31 32 33]] E --> G[結果:[[31 34 36], [34 37 39]]]
在這個圖表中,我們展示了NumPy陣列廣播的過程。從左到右, мы可以看到一維陣列廣播和二維陣列廣播的過程,以及結果。
NumPy陣列的強大功能
在本章中,我們將深入探討NumPy陣列的概念,包括其建立、操作和應用。首先,我們來看看如何建立一維和二維陣列。
建立一維陣列
一維陣列可以使用列表或元組來建立。例如:
import numpy as np
myarr1 = np.array([21, 22, 23])
print(myarr1) # Output: [21 22 23]
我們也可以使用arange()
函式來建立一維陣列:
myarr2 = np.arange(10, 13)
print(myarr2) # Output: [10 11 12]
建立二維陣列
二維陣列可以使用巢狀列表來建立。例如:
myarr3 = np.array([[21, 22, 23], [24, 25, 26]])
print(myarr3)
# Output:
# [[21 22 23]
# [24 25 26]]
陣列運算
NumPy陣列支援各種運算,包括加、減、乘、除等。例如:
myarr1 = np.array([21, 22, 23])
myarr2 = np.array([10, 12, 13])
print(myarr1 + myarr2) # Output: [31 34 36]
廣播(Broadcasting)
廣播是NumPy的一個強大功能,允許我們對不同形狀的陣列進行運算。例如:
myarr1 = np.array([21, 22, 23])
myarr2 = np.array([10])
print(myarr1 + myarr2) # Output: [31 32 33]
重點回顧
- NumPy陣列是由C和Python語言實作的。
- NumPy陣列具有高效能和低記憶體佔用,適合用於機器學習演算法。
- NumPy陣列支援向量運算,與列表不同。
- 可以使用列表、元組、
arange()
、linspace()
、zeros()
、ones()
、full()
、eye()
、diag()
和empty()
函式來建立一維陣列。 randint()
函式可以生成隨機整數。shuffle()
函式可以打亂給定陣列中的元素順序。
在下一章中,我們將學習如何使用NumPy的各種函式來操縱陣列,包括矩陣乘法和線性代數運算。
探索NumPy陣列操作
簡介
在前一章中,我們瞭解了什麼是NumPy陣列以及如何使用各種方法建立ndarrays,包括存取和迭代ndarray元素。除了這些之外,NumPy還提供了一套全面的陣列操作函式,對於高效的資料處理和分析至關重要。瞭解如何重塑陣列、串聯或堆積疊多個陣列,以及將其拆分為有意義的段是管理和準備資料集的關鍵。對ndarrays進行排序和搜尋操作對於組織和提取相關資訊至關重要,而動態插入或刪除元素的能力則增強了資料操作能力。此外,NumPy的點函式(dot function)用於矩陣乘法,線性代數模組(linalg module)用於線性代數運算,也是非常重要的。
重塑陣列
NumPy提供了多種方法來重塑陣列,包括reshape()
函式,可以將陣列重塑為新的形狀。以下是一個示例:
import numpy as np
# 建立一個1D陣列
arr = np.array([1, 2, 3, 4, 5, 6])
# 重塑為2D陣列
new_arr = arr.reshape(2, 3)
print(new_arr)
輸出:
[[1 2 3]
[4 5 6]]
串聯和堆積疊陣列
NumPy提供了concatenate()
函式,可以將多個陣列串聯在一起。以下是一個示例:
import numpy as np
# 建立兩個1D陣列
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# 串聯兩個陣列
new_arr = np.concatenate((arr1, arr2))
print(new_arr)
輸出:
[1 2 3 4 5 6]
拆分陣列
NumPy提供了split()
函式,可以將陣列拆分為多個子陣列。以下是一個示例:
import numpy as np
# 建立一個1D陣列
arr = np.array([1, 2, 3, 4, 5, 6])
# 拆分為兩個子陣列
new_arr1, new_arr2 = np.split(arr, 2)
print(new_arr1)
print(new_arr2)
輸出:
[1 2 3]
[4 5 6]
排序和搜尋
NumPy提供了sort()
函式,可以對陣列進行排序。以下是一個示例:
import numpy as np
# 建立一個1D陣列
arr = np.array([4, 2, 6, 1, 3])
# 對陣列進行排序
new_arr = np.sort(arr)
print(new_arr)
輸出:
[1 2 3 4 6]
動態插入和刪除元素
NumPy提供了insert()
函式,可以動態插入元素到陣列中。以下是一個示例:
import numpy as np
# 建立一個1D陣列
arr = np.array([1, 2, 3])
# 插入一個新元素
new_arr = np.insert(arr, 1, 4)
print(new_arr)
輸出:
[1 4 2 3]
矩陣乘法和線性代數運算
NumPy提供了dot()
函式,可以進行矩陣乘法。以下是一個示例:
import numpy as np
# 建立兩個2D陣列
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
# 進行矩陣乘法
new_arr = np.dot(arr1, arr2)
print(new_arr)
輸出:
[[19 22]
[43 50]]
數值運算的基礎:NumPy 的陣列操作
NumPy 的陣列操作是數值運算的基礎工具,對於處理複雜的數學計算至關重要。它使得 NumPy 成為研究人員、資料科學家和工程師在處理大規模數值資料時不可或缺的資源。
結構
在本章中,我們將討論以下主題:
- NumPy 中的陣列操作函式和變數
- 多個陣列合併成單一陣列
- 將陣列分割成小陣列
- 對 NumPy 中的 ndarray 進行排序
- 在 NumPy 中搜尋 ndarray 的元素
- 將元素插入到 ndarray 中
- 從 NumPy 中的 ndarray 刪除元素
- 使用 dot 函式進行矩陣乘法
- 使用 NumPy 的 linalg 模組
目標
透過本章,讀者將瞭解 NumPy 中各種陣列操作函式和變數。我們將探討不同的方法來合併 ndarray,並瞭解如何將 ndarray 分割成小陣列。同時,我們也將探討 NumPy 中的排序、搜尋、插入和刪除元素等功能。此外,讀者將學習如何使用 dot 函式進行矩陣乘法,以及如何使用 NumPy 的 linalg 模組進行線性代數運算。因此,讀者將能夠充分理解 NumPy 陣列的概念、建立方法及其在機器學習演算法中的重要性。在本章中,我們也將使用 mynp
作為 NumPy 函式庫的別名。
陣列操作函式和變數
NumPy 中的陣列操作函式和變數對於高效的資料操作和分析至關重要。這些工具使我們能夠重塑陣列、沿著特定軸合併或分割陣列、轉置陣列以及提取陣列維度和形狀的資訊。這些操作對於資料預處理、影像處理、數值模擬和統計分析等任務至關重要,允許對陣列資料結構進行流暢和最佳化的操作,而這些資料結構是許多科學和資料驅動應用的基礎。
reshape()
reshape()
函式可以在不交換其資料的情況下改變陣列的形狀。它是 NumPy 模組中的函式,也是 ndarray 類別中的方法。只要確保大小匹配,否則將會引發 ValueError。這裡,建立的是檢視而不是副本,因此,如果原始陣列發生變化,重塑後的陣列也會反映出這些變化。以下是其語法:
mynp.reshape(a, newshape)
這個函式需要兩個引數:原始陣列 a
和新的形狀 newshape
。新的形狀應該是一個元組,指定了重塑後陣列的維度。
重塑陣列:NumPy 的 reshape()
函式
NumPy 的 reshape()
函式是一種強大的工具,允許您在不改變陣列中的資料的情況下,變更陣列的形狀。這個函式可以使用兩種不同的風格:函式式和物件導向式。
函式式風格
您可以使用 mynp.reshape()
函式來重塑陣列,例如:
import numpy as mynp
myarr1 = mynp.arange(1, 7)
myarr2 = mynp.reshape(myarr1, (2, 3))
物件導向式風格
或者,您可以使用 reshape()
方法來重塑陣列,例如:
myarr1 = mynp.arange(1, 7)
myarr2 = myarr1.reshape((2, 3))
示例程式:Chap3_Example3.1.py
以下是示範 reshape()
函式的程式碼:
import numpy as mynp
# 1-D 陣列轉換為 2-D 陣列
myarr1 = mynp.arange(1, 7)
myarr2 = myarr1.reshape((2, 3))
print(f"myarr1 是:{myarr1}")
print(f"myarr2 是:{myarr2}")
# 修改原始陣列的第 2 個索引值
myarr1[1] = 12
print(f"修改後的 myarr1 是:{myarr1}")
print(f"修改後的 myarr2 是:{myarr2}")
# F Style 排序
print("F Style 排序 ---------------------------")
內容解密:
在上述程式碼中,我們首先建立一個 1-D 陣列 myarr1
,然後使用 reshape()
方法將其轉換為 2-D 陣列 myarr2
。接著,我們修改原始陣列 myarr1
的第 2 個索引值,並觀察到 myarr2
也隨之改變。這表明 reshape()
函式並沒有複製原始陣列的資料,而是傳回一個新的檢視。
圖表翻譯:
flowchart TD A[原始陣列] --> B[reshape()] B --> C[新檢視] C --> D[修改原始陣列] D --> E[新檢視更新]
在這個流程圖中,我們可以看到原始陣列 A
被傳入 reshape()
函式,然後傳回一個新的檢視 C
。當我們修改原始陣列 A
時,新的檢視 C
也會更新。這表明 reshape()
函式傳回的是一個新的檢視,而不是一個複製的陣列。
重新塑形和調整大小
在 NumPy 中,重新塑形和調整大小是兩個重要的操作,可以用來改變陣列的形狀和大小。這兩個操作可以用來建立新的陣列或修改現有的陣列。
重新塑形(reshape)
重新塑形是一個用來改變陣列形狀的操作。它可以用來將一個一維陣列轉換為二維或多維陣列。重新塑形不會改變陣列中的資料,只會改變資料的排列方式。
以下是使用 reshape
函式進行重新塑形的範例:
import numpy as np
myarr3 = np.arange(1, 7)
myarr4 = myarr3.reshape((2, 3), order='F')
print(f"myarr3 is : {myarr3}")
print(f"myarr4 is : {myarr4}")
輸出:
myarr3 is : [1 2 3 4 5 6]
myarr4 is : [[1 3 5]
[2 4 6]]
在這個範例中,myarr3
是一個一維陣列,包含 6 個元素。使用 reshape
函式,我們可以將其轉換為一個 2x3 的二維陣列,myarr4
。注意,order='F'
引數指定了重新塑形的順序。
調整大小(resize)
調整大小是一個用來改變陣列大小的操作。它可以用來增加或減少陣列中的元素數量。調整大小可以使用函式式或物件導向式的方式進行。
以下是使用 resize
函式進行調整大小的範例:
import numpy as np
myarr = np.arange(1, 7)
myarr_resized = np.resize(myarr, (2, 3))
print(f"myarr is : {myarr}")
print(f"myarr_resized is : {myarr_resized}")
輸出:
myarr is : [1 2 3 4 5 6]
myarr_resized is : [[1 2 3]
[4 5 6]]
在這個範例中,myarr
是一個一維陣列,包含 6 個元素。使用 resize
函式,我們可以將其調整為一個 2x3 的二維陣列,myarr_resized
。注意,如果新的形狀需要更多元素,則會重複原始陣列中的元素。
物件導向式調整大小
調整大小也可以使用物件導向式的方式進行。以下是範例:
import numpy as np
myarr = np.arange(1, 7)
myarr.resize((2, 3), refcheck=True)
print(f"myarr is : {myarr}")
輸出:
myarr is : [[1 2 3]
[4 5 6]]
在這個範例中,myarr
是一個一維陣列,包含 6 個元素。使用 resize
方法,我們可以將其調整為一個 2x3 的二維陣列。注意,refcheck=True
引數指定了是否進行參考檢查。
使用 NumPy 尺寸重塑功能
NumPy 的 resize
函式提供了一種簡單的方法來調整陣列的尺寸。這個函式可以以兩種風格使用:函式式和物件導向式。
函式式重塑
首先,我們來看看如何使用函式式風格來重塑陣列的尺寸。以下是範例程式碼:
import numpy as np
# 建立一個原始陣列
myarr1 = np.arange(1, 5)
# 使用 resize 函式重塑陣列尺寸
myarr2 = np.resize(myarr1, (2, 3))
print(f"myarr1 是:{myarr1}")
print(f"myarr2 是:{myarr2}")
輸出結果:
myarr1 是:[1 2 3 4]
myarr2 是:[[1 2 3]
[4 1 2]]
如您所見,原始陣列 myarr1
被重塑為一個 2x3 的陣列 myarr2
。如果原始陣列的元素不足以填充新的尺寸,則會從頭開始重複元素。
物件導向式重塑
現在,我們來看看如何使用物件導向式風格來重塑陣列的尺寸。以下是範例程式碼:
import numpy as np
# 建立一個原始陣列
myarr3 = np.arange(1, 5)
# 使用 resize 方法重塑陣列尺寸
myarr3.resize((2, 3))
print(f"myarr3 是:{myarr3}")
輸出結果:
myarr3 是:[[1 2 3]
[4 0 0]]
在這種情況下,原始陣列 myarr3
被重塑為一個 2x3 的陣列。如果原始陣列的元素不足以填充新的尺寸,則會用零填充。
內容解密:
np.resize
函式可以用於重塑陣列的尺寸。resize
方法可以用於重塑陣列的尺寸,並修改原始陣列。- 如果原始陣列的元素不足以填充新的尺寸,則會從頭開始重複元素或用零填充。
圖表翻譯:
flowchart TD A[原始陣列] --> B[重塑尺寸] B --> C[函式式重塑] C --> D[使用 np.resize] D --> E[傳回重塑後的陣列] B --> F[物件導向式重塑] F --> G[使用 resize 方法] G --> H[修改原始陣列]
這個流程圖展示瞭如何使用 NumPy 的 resize
函式和 resize
方法來重塑陣列的尺寸。
陣列扁平化:flatten() 方法
在 NumPy 中,flatten()
方法是一種用於將多維陣列轉換為一維陣列的技術。這個方法傳回一個新的一維陣列,它是原始多維陣列的複製。需要注意的是,flatten()
不是一個 NumPy 函式,而是 ndarray
類別中的方法。
語法
ndarray.flatten(order='C')
引數
order
:指定陣列元素的存取順序。預設值為'C'
,表示按行優先(C 風格)的順序存取元素。另一個選項是'F'
,表示按列優先(Fortran 風格)的順序存取元素。
示例
以下範例展示瞭如何使用 flatten()
方法:
import numpy as np
# 示例 1:預設順序 ('C')
print("示例 1:預設順序 ('C')")
arr1 = np.arange(1, 7).reshape(2, 3)
arr2 = arr1.flatten()
print(f"原始陣列 arr1:\n{arr1}")
print(f"扁平化後的陣列 arr2:\n{arr2}")
# 示例 2:修改原始陣列值
print("\n示例 2:修改原始陣列值")
arr1[0, 0] = 13
print(f"修改後的原始陣列 arr1:\n{arr1}")
print(f"扁平化後的陣列 arr2(未變):\n{arr2}")
# 示例 3:使用 'F' 順序
print("\n示例 3:使用 'F' 順序")
arr3 = arr1.flatten('F')
print(f"使用 'F' 順序扁平化後的陣列 arr3:\n{arr3}")
結果分析
- 在示例 1 中,
arr1
是一個 2x3 的二維陣列,透過flatten()
方法轉換為一維陣列arr2
。由於預設順序為'C'
,所以arr2
的元素順序與arr1
的行優先順序相同。 - 在示例 2 中,修改
arr1
的值並不會影響已經扁平化的arr2
,因為flatten()
傳回的是原始陣列的複製。 - 在示例 3 中,透過指定
order='F'
,可以按列優先的順序存取元素,從而得到不同的扁平化結果arr3
。
內容解密:
flatten()
方法的主要功能是將多維陣列轉換為一維陣列。- 預設順序為
'C'
,表示按行優先的順序存取元素。 - 可以透過指定
order='F'
改變存取順序為按列優先。 - 修改原始陣列值不會影響已經扁平化的陣列。
圖表翻譯:
flowchart TD A[原始陣列] --> B[flatten() 方法] B --> C[一維陣列] C --> D[傳回複製] D --> E[修改原始陣列] E --> F[不影響扁平化陣列]
這個流程圖描述了從原始陣列到扁平化陣列的過程,以及修改原始陣列對扁平化陣列的影響。
從底層實作到高階應用的全面檢視顯示,NumPy 陣列的屬性和運算為 Python 的數值計算提供了堅實的基礎。透過多維陣列和廣播機制,NumPy 能夠高效地處理大量數值資料,實作向量化運算,從而顯著提升效能。然而,廣播機制也存在一些限制,例如,當陣列形狀不滿足廣播規則時,會導致錯誤。對於初學者而言,深入理解廣播機制及不同形狀陣列間的運算規則至關重要。此外,reshape()
、resize()
、flatten()
等函式的靈活運用,能進一步提升陣列操作的效率,簡化複雜的資料處理流程。玄貓認為,熟練掌握 NumPy 陣列操作,對於任何想在 Python 中進行高效數值計算的開發者都至關重要,這將為資料科學、機器學習等領域的進階應用奠定堅實的基礎。