NumPy 是 Python 資料科學領域的核心函式庫,提供高效能的多維陣列物件 ndarray 以及用於處理這些陣列的工具。理解 ndarray 的屬性和運算是進行數值計算的基礎。本文將詳細介紹如何建立 NumPy 陣列、檢視其屬性,並示範基本的陣列運算和廣播機制,以及如何使用 reshape、resize 和 flatten 方法操作陣列形狀和維度。這些操作是資料科學、機器學習等領域的基本,能有效處理和分析大量數值資料。透過瞭解這些基本操作,開發者可以更有效率地運用 NumPy 進行資料處理和分析。

瞭解 NumPy 陣列的屬性和運算

在這個範例中,我們將探討如何使用 NumPy 建立陣列、瞭解其屬性(維度、大小和形狀),以及如何進行基本的陣列運算。

建立 NumPy 陣列

首先,我們建立兩個 NumPy 陣列:myarr1myarr2myarr1 是一個 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 陣列的屬性

接下來,我們印出 myarr1myarr2 的維度(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 陣列

然後,我們簡單地印出 myarr1myarr2 的內容。

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() 函式。
  • 可以使用 ndimsizeshape 屬性來瞭解陣列的維度、大小和形狀。
  • 基本的陣列運算(加法、減法、乘法和除法)可以使用對應的 NumPy 函式進行,例如 np.add()np.subtract()np.multiply()np.divide()

瞭解NumPy陣列運算

NumPy(Numerical Python)是一個強大的Python函式庫,主要用於數值計算。它提供了多維陣列和矩陣,以及一系列運算這些陣列的函式。

建立NumPy陣列

首先,我們需要建立兩個NumPy陣列:myarr1myarr2

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中的廣播機制是一種強大的工具,允許使用者對不同形狀和大小的陣列進行運算。這種機制在進行算術運算時自動執行,當指定的規則滿足時。廣播機制的必要性在於處理不同維度、形狀或大小的陣列時。

廣播規則

廣播規則如下:

  1. 維度一致性:確保兩個陣列的維度相同。NumPy會調整陣列以使其具有相同的維度,如果最初不同。這種調整涉及在左側用1填充具有較少維度的陣列的形狀,直到兩個陣列具有相同的維度。
(2,3)(2,3)
(3)(1,3)

例如,讓我們考慮兩個陣列:mynp1具有形狀(2,3),是一個2D陣列,而mynp2具有形狀(3),是一個1D陣列。這兩個陣列的維度不同,透過廣播機制,mynp2陣列的形狀會被調整為(1,3)。

  1. 大小匹配:如果兩個陣列在任何維度上的大小不匹配,且有一個陣列在該維度上的大小為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會自動將陣列廣播到相同的形狀,以便進行元素對元素的運算。

一維陣列廣播

首先,我們建立兩個一維陣列:myarr1myarr2myarr1包含三個元素: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}")

當我們將myarr1myarr2相加時,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的每個元素相加。

二維陣列廣播

現在,我們來看一下二維陣列的廣播。建立兩個二維陣列:myarr3myarr4myarr3是一個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}")

當我們將myarr3myarr4相加時,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 中進行高效數值計算的開發者都至關重要,這將為資料科學、機器學習等領域的進階應用奠定堅實的基礎。