NumPy 作為 Python 資料科學的基本,提供高效的多維陣列和矩陣運算,是處理數值資料的利器。本文從建立 NumPy 陣列開始,逐步講解 reshape、resize、flatten、transpose 等陣列操作技巧,並深入探討合併與分割陣列的各種方法,最後介紹排序、搜尋和插入元素等實用功能。接著,文章將焦點轉向 Scipy 這個更偏向科學計算的函式庫,說明其子模組架構,並以物理常數和度量標準為例,展現 Scipy 在科學計算領域的應用。最後,文章比較了 NumPy 和 Scipy 的差異與互補性,讓讀者更清晰地瞭解如何在不同場景下選擇合適的工具。

重點記住

  • Jupyter Notebook是一種根據網頁的互動式計算環境。
  • Jupyter Notebook支援多種程式語言,包括Python、R、Julia等。
  • VSCode是一種流行的code編輯器,同樣支援Jupyter Notebook的功能。
  • Python有多種資料科學函式庫,包括NumPy、Pandas、Matplotlib等。

問題

  1. 如何在Windows環境下安裝Jupyter Notebook?
  2. Jupyter Notebook的優點是什麼?
  3. 如何使用Jupyter Notebook建立一個簡單的Python程式?

探索NumPy函式庫

NumPy(Numerical Python)是一個用於數值計算的Python函式庫。它提供了支援大型、多維陣列和矩陣的資料結構和操作。

結構

NumPy的核心資料結構是ndarray,它是一個多維陣列,可以儲存數值資料。

目標

  • 瞭解NumPy的基本資料結構和操作。
  • 學習如何建立和操作NumPy陣列。

共同特性

NumPy陣列有一些共同特性,包括:

  • 資料型別:NumPy陣列可以儲存不同的資料型別,包括整數、浮點數和複數等。
  • 形狀:NumPy陣列有形狀屬性,可以用來描述陣列的維度和大小。

使用linspace()函式建立陣列

linspace()函式可以用來建立一個均勻分佈的陣列。以下是示例code:

import numpy as np

# 建立一個從0到10的均勻分佈陣列
arr = np.linspace(0, 10, 5)
print(arr)

這將會輸出 [0. 2.5 5. 7.5 10. ]

使用zeros()函式建立陣列

zeros()函式可以用來建立一個全為零的陣列。以下是示例code:

import numpy as np

# 建立一個3x3全為零的陣列
arr = np.zeros((3, 3))
print(arr)

這將會輸出 [[0. 0. 0.] [0. 0. 0.] [0. 0. 0.]]

內容解密:

  • linspace()函式可以用來建立一個均勻分佈的陣列。
  • zeros()函式可以用來建立一個全為零的陣列。
  • NumPy陣列有一些共同特性,包括資料型別和形狀。

圖表翻譯:

  graph LR
    A[linspace()] --> B[均勻分佈陣列]
    C[zeros()] --> D[全為零陣列]
    B --> E[NumPy陣列]
    D --> E

這個圖表展示瞭如何使用linspace()和zeros()函式建立NumPy陣列。

NumPy 基礎功能與應用

NumPy 是 Python 中一個強大的數值計算函式庫,提供了多維陣列和矩陣運算的功能。以下將介紹 NumPy 中的一些基礎功能和應用。

1. 使用 ones() 函式

ones() 函式用於建立一個全為 1 的多維陣列。例如:

import numpy as np
arr = np.ones((3, 4))
print(arr)

輸出:

[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]

內容解密:

ones() 函式的引數是一個元組,代表著多維陣列的形狀。在這個例子中,(3, 4) 代表著一個 3x4 的矩陣。函式傳回一個全為 1 的多維陣列。

2. 使用 full() 函式

full() 函式用於建立一個全為指定值的多維陣列。例如:

import numpy as np
arr = np.full((3, 4), 5)
print(arr)

輸出:

[[5 5 5 5]
 [5 5 5 5]
 [5 5 5 5]]

內容解密:

full() 函式的第一個引數是一個元組,代表著多維陣列的形狀。第二個引數是指定值。在這個例子中,(3, 4) 代表著一個 3x4 的矩陣,5 是指定值。函式傳回一個全為指定值的多維陣列。

3. 使用 eye() 函式

eye() 函式用於建立一個單位矩陣。例如:

import numpy as np
arr = np.eye(3)
print(arr)

輸出:

[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

內容解密:

eye() 函式的引數是一個整數,代表著矩陣的大小。在這個例子中,3 代表著一個 3x3 的矩陣。函式傳回一個單位矩陣,即主對角線上的元素為 1,其他元素為 0 的矩陣。

4. 使用 diag() 函式

diag() 函式用於從多維陣列中提取對角線元素或建立一個對角矩陣。例如:

import numpy as np
arr = np.diag([1, 2, 3])
print(arr)

輸出:

[[1 0 0]
 [0 2 0]
 [0 0 3]]

內容解密:

diag() 函式的引數是一個列表,代表著對角線元素。在這個例子中,[1, 2, 3] 代表著對角線元素。函式傳回一個對角矩陣,即只有對角線元素非零的矩陣。

5. 使用 empty() 函式

empty() 函式用於建立一個空的多維陣列。例如:

import numpy as np
arr = np.empty((3, 4))
print(arr)

輸出:

[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]

內容解密:

empty() 函式的引數是一個元組,代表著多維陣列的形狀。在這個例子中,(3, 4) 代表著一個 3x4 的矩陣。函式傳回一個空的多維陣列,即內容未初始化的陣列。

zeros 和 empty 函式的區別

zeros() 函式和 empty() 函式都可以用於建立多維陣列,但是 zeros() 函式傳回一個全為零的陣列,而 empty() 函式傳回一個空的陣列,即內容未初始化的陣列。

使用 random 模組建立 ndarray

random 模組提供了多種隨機數生成器,可以用於建立 ndarray。例如:

import numpy as np
arr = np.random.randint(0, 10, (3, 4))
print(arr)

輸出:

[[5 8 4 1]
 [9 6 7 3]
 [2 5 8 9]]

內容解密:

random.randint() 函式的第一個引數是最小值,第二個引數是最大值,第三個引數是一個元組,代表著多維陣列的形狀。在這個例子中,(3, 4) 代表著一個 3x4 的矩陣。函式傳回一個隨機整數 ndarray。

隨機打亂 ndarray

可以使用 shuffle() 函式隨機打亂 ndarray 的元素。例如:

import numpy as np
arr = np.array([1, 2, 3, 4, 5])
np.random.shuffle(arr)
print(arr)

輸出:

[3 5 1 2 4]

內容解密:

shuffle() 函式的引數是一個 ndarray。函式隨機打亂 ndarray 的元素。

存取 ndarray 的元素

可以使用索引存取 ndarray 的元素。例如:

import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print(arr[0])  # 輸出:1
print(arr[-1])  # 輸出:5

內容解密:

索引可以用於存取 ndarray 的元素。索引從 0 開始,可以使用負索引存取末尾的元素。

遍歷 ndarray 的元素

可以使用迴圈遍歷 ndarray 的元素。例如:

import numpy as np
arr = np.array([1, 2, 3, 4, 5])
for elem in arr:
    print(elem)

輸出:

1
2
3
4
5

內容解密:

迴圈可以用於遍歷 ndarray 的元素。

算術運運算元在 numpy 中的應用

numpy 支援多種算術運運算元,可以用於 ndarray 之間的運算。例如:

import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
print(arr1 + arr2)  # 輸出:[5 7 9]

內容解密:

算術運運算元可以用於 ndarray 之間的運算。結果是兩個 ndarray 元素相加後的新 ndarray。

Broadcasting 概念在 numpy 中的應用

Broadcasting 是 numpy 中的一個重要概念,允許不同形狀的 ndarray 之間進行運算。例如:

import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4])
print(arr1 + arr2)  # 輸出:[5 6 7]

內容解密:

Broadcasting 可以用於不同形狀的 ndarray 之間進行運算。結果是兩個 ndarray 元素相加後的新 ndarray。

重點記住

  • ones() 函式用於建立一個全為 1 的多維陣列。
  • full() 函式用於建立一個全為指定值的多維陣列。
  • eye() 函式用於建立一個單位矩陣。
  • diag() 函式用於從多維陣列中提取對角線元素或建立一個對角矩陣。
  • empty() 函式用於建立一個空的多維陣列。
  • random 模組提供了多種隨機數生成器,可以用於建立 ndarray。
  • shuffle() 函式可以用於隨機打亂 ndarray 的元素。
  • 索引可以用於存取 ndarray 的元素。
  • 迴圈可以用於遍歷 ndarray 的元素。
  • 算術運運算元可以用於 ndarray 之間的運算。
  • Broadcasting 是 numpy 中的一個重要概念,允許不同形狀的 ndarray 之間進行運算。

探索NumPy中的陣列操作

簡介

NumPy是Python中的一個強大函式庫,提供了高效的陣列和矩陣操作。它是大多數科學計算和資料分析任務的基礎。在本文中,我們將探索NumPy中陣列操作的各種方法,包括重塑、重新調整大小、扁平化、轉置和合併陣列。

結構

本文將分為以下幾個部分:

  1. 陣列操作函式/變數:介紹NumPy中用於操作陣列的主要函式和變數。
  2. 重塑和重新調整大小:探索reshape()resize()函式的用法。
  3. 扁平化和轉置:學習如何使用flatten()flat變數、ravel()transpose()函式來操作陣列。
  4. 合併陣列:瞭解如何使用concatenate()stack()函式將多個陣列合併成一個單一的陣列。

陣列操作函式/變數

NumPy提供了多種陣列操作函式和變數,包括:

  • reshape(): 重塑陣列的形狀。
  • resize(): 重新調整陣列的大小。
  • flatten(): 將多維陣列扁平化為一維陣列。
  • flat: 一個變數,傳回一個可迭代的物件,允許遍歷陣列的元素。
  • ravel(): 將多維陣列扁平化為一維陣列,類別似於flatten().
  • transpose(): 轉置陣列,即交換行和列。

重塑和重新調整大小

reshape()resize()函式允許您改變陣列的形狀或大小。

import numpy as np

# 建立一個原始陣列
original_array = np.array([1, 2, 3, 4, 5, 6])

# 重塑陣列為2x3
reshaped_array = original_array.reshape(2, 3)
print(reshaped_array)

扁平化和轉置

flatten()flat變數、ravel()transpose()函式提供了不同的方法來操作陣列。

import numpy as np

# 建立一個2x3的原始陣列
original_array = np.array([[1, 2, 3], [4, 5, 6]])

# 將陣列扁平化為一維
flattened_array = original_array.flatten()
print(flattened_array)

# 使用ravel()函式扁平化陣列
raveled_array = original_array.ravel()
print(raveled_array)

# 轉置陣列
transposed_array = original_array.transpose()
print(transposed_array)

合併陣列

concatenate()stack()函式允許您將多個陣列合併成一個單一的陣列。

import numpy as np

# 建立兩個原始陣列
array1 = np.array([1, 2, 3])
array2 = np.array([4, 5, 6])

# 合併兩個陣列
concatenated_array = np.concatenate((array1, array2))
print(concatenated_array)

# 使用stack()函式垂直堆積疊兩個陣列
stacked_array = np.stack((array1, array2), axis=0)
print(stacked_array)

高效陣列操作:NumPy 的分割與排序

NumPy 是 Python 中一個強大的數值計算函式庫,提供了多種高效的陣列操作方法。在這篇文章中,我們將探討 NumPy 中的陣列分割和排序功能。

陣列堆積疊

NumPy 提供了三種堆積疊方式:垂直堆積疊(vstack)、水平堆積疊(hstack)和深度堆積疊(dstack)。這些函式可以用來合併多個陣列,形成新的陣列。

垂直堆積疊(vstack)

垂直堆積疊是指沿著垂直方向(axis=0)合併陣列。例如:

import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

result = np.vstack((a, b))
print(result)

輸出:

[[1 2 3]
 [4 5 6]]

水平堆積疊(hstack)

水平堆積疊是指沿著水平方向(axis=1)合併陣列。例如:

import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

result = np.hstack((a, b))
print(result)

輸出:

[1 2 3 4 5 6]

深度堆積疊(dstack)

深度堆積疊是指沿著深度方向(axis=2)合併陣列。例如:

import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

result = np.dstack((a, b))
print(result)

輸出:

[[1 4]
 [2 5]
 [3 6]]

陣列分割

NumPy 提供了多種分割方式,包括 split、vsplit、hsplit、dsplit 和 array_split。

split

split 函式可以將陣列分割成多個子陣列。例如:

import numpy as np

a = np.array([1, 2, 3, 4, 5, 6])

result = np.split(a, 3)
print(result)

輸出:

[array([1, 2]), array([3, 4]), array([5, 6])]

vsplit

vsplit 函式可以將陣列沿著垂直方向分割。例如:

import numpy as np

a = np.array([[1, 2], [3, 4], [5, 6]])

result = np.vsplit(a, 3)
print(result)

輸出:

[array([[1, 2]]), array([[3, 4]]), array([[5, 6]])]

hsplit

hsplit 函式可以將陣列沿著水平方向分割。例如:

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])

result = np.hsplit(a, 3)
print(result)

輸出:

[array([[1]]), array([[2]]), array([[3]]), array([[4]]), array([[5]]), array([[6]])]

dsplit

dsplit 函式可以將陣列沿著深度方向分割。例如:

import numpy as np

a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])

result = np.dsplit(a, 2)
print(result)

輸出:

[array([[[1, 2],
        [3, 4]]]), array([[[5, 6],
        [7, 8]]])]

array_split

array_split 函式可以將陣列分割成多個子陣列,且子陣列的大小可以不同。例如:

import numpy as np

a = np.array([1, 2, 3, 4, 5, 6])

result = np.array_split(a, 3)
print(result)

輸出:

[array([1, 2]), array([3, 4]), array([5, 6])]

陣列排序

NumPy 提供了多種排序方式,包括 sort、argsort 和 argmax。

sort

sort 函式可以將陣列中的元素排序。例如:

import numpy as np

a = np.array([4, 2, 9, 6])

result = np.sort(a)
print(result)

輸出:

[2 4 6 9]

argsort

argsort 函式可以傳回陣列中元素的索引,按照升序排列。例如:

import numpy as np

a = np.array([4, 2, 9, 6])

result = np.argsort(a)
print(result)

輸出:

[1 0 3 2]

argmax

argmax 函式可以傳回陣列中最大元素的索引。例如:

import numpy as np

a = np.array([4, 2, 9, 6])

result = np.argmax(a)
print(result)

輸出:

2

元素搜尋

NumPy 提供了多種元素搜尋方式,包括 where 和 condition based selection。

where

where 函式可以傳回陣列中滿足條件的元素的索引。例如:

import numpy as np

a = np.array([1, 2, 3, 4, 5])

result = np.where(a > 3)
print(result)

輸出:

(array([3, 4], dtype=int64),)

condition based selection

condition based selection 可以傳回陣列中滿足條件的元素。例如:

import numpy as np

a = np.array([1, 2, 3, 4, 5])

result = a[a > 3]
print(result)

輸出:

[4 5]

元素插入

NumPy 提供了 insert 函式,可以將元素插入到陣列中。

insert

insert 函式可以將元素插入到陣列中的指定位置。例如:

import numpy as np

a = np.array([1, 2, 3])

result = np.insert(a, 1, 4)
print(result)

輸出:

[1 4 2 3]

探索Scipy函式庫:Python資料科學的強大工具

簡介

在Python的資料科學生態系統中,Scipy是一個不可或缺的函式庫。它提供了許多高階功能,包括訊號處理、線性代數、最佳化、統計和特殊函式等。與NumPy相比,Scipy更注重於科學計算和資料分析。在本章中,我們將深入探索Scipy函式庫,瞭解其結構、目標和主要功能。

結構

Scipy的結構與NumPy相似,但它包含了更多的子模組,每個子模組都專注於特定的領域。這些子模組包括:

  • scipy.cluster: 叢集分析
  • scipy.constants: 物理常數
  • scipy.fft: 快速傅立葉變換
  • scipy.integrate: 數值積分
  • scipy.linalg: 線性代數運算
  • scipy.misc: 雜項功能
  • scipy.ndimage: 多維資料處理
  • scipy.optimize: 最佳化演算法
  • scipy.signal: 訊號處理
  • scipy.sparse: 稀疏矩陣運算
  • scipy.spatial: 空間演算法
  • scipy.special: 特殊函式
  • scipy.stats: 統計分析

目標

Scipy的主要目標是為科學計算和資料分析提供一個強大且易用的工具集。它旨在幫助使用者高效地完成各種任務,從基本的資料處理到複雜的科學計算。

差異點:NumPy vs Scipy

雖然NumPy和Scipy都是Python的重要函式庫,但它們有不同的焦點。NumPy主要關注於多維陣列和矩陣運算,而Scipy則提供了更多高階功能,包括訊號處理、線性代數、最佳化等。簡而言之,NumPy是基礎,而Scipy是基礎上的延伸。

探索Scipy常數

Scipy提供了一系列物理常數,可以透過scipy.constants模組存取。這些常數包括了物理學中常用的值,如光速、電子電荷、普朗克常數等。

import scipy.constants as const

print(const.c)  # 光速(m/s)
print(const.e)  # 電子電荷(C)
print(const.h)  # 普朗克常數(J s)

Metric:度量標準

在Scipy中,度量標準(Metric)是指用於衡量兩個向量之間距離或相似性的函式。這些函式在叢集分析、最佳化演算法等領域中非常重要。

from scipy.spatial import distance

# 計算兩個向量之間的歐幾裡得距離
v1 = [1, 2, 3]
v2 = [4, 5, 6]
dist = distance.euclidean(v1, v2)
print(dist)

重點回顧

  • Scipy是一個為科學計算和資料分析提供高階功能的函式庫。
  • Scipy的結構包括多個子模組,每個子模組都專注於特定的領域。
  • Scipy提供了物理常數和度量標準等功能。
  • Scipy與NumPy相比,更注重於高階功能和科學計算。

問題

  1. 如何使用Scipy計算兩個向量之間的歐幾裡得距離?
  2. Scipy中如何存取物理常數?
  3. 如何使用Scipy進行訊號處理?

透過本章的學習,你已經對Scipy函式庫有了初步的瞭解。下一步,你可以深入探索每個子模組,學習更多高階功能,以提高你的資料科學技能。

從技術生態圈的動態變化來看,NumPy 和 SciPy 作為 Python 資料科學的核心基本,展現了其不可或缺的價值。本文深入剖析了 NumPy 的陣列操作、分割、排序、搜尋及插入,以及 SciPy 的常數、度量標準等功能,並與 NumPy 的功能差異做了比較。這些功能的熟練運用,能大幅提升資料處理和分析的效率。然而,SciPy 部分功能的學習曲線較陡峭,需要投入更多時間和精力。考量不同專案的實際需求,技術團隊應優先掌握 NumPy 的核心陣列操作,並逐步深入 SciPy 的特定子模組,例如訊號處理、線性代數等,才能最大化發揮其潛力。玄貓認為,隨著資料科學的蓬勃發展,精通 NumPy 和 SciPy 將成為資料科學家和工程師的必備技能,其應用範圍也將持續擴充套件到更多領域。