2022年1月4日 星期二

Hello NumPy!

本系列文章希望能讓有興趣學習資料科學(Data Science)及Python程式語言的人,透過全新不同的方式,由淺入深獲得相關知識,除了前一篇的Python初體驗文章,這一篇將帶領大家了解未來進入資訊科學領域前,如何利用NumPy函式庫的強大功能,理解相關的基礎應用。

NumPy Introduction

NumPy是Python在進行科學運算時,一個非常基礎的Package,同時也是非常核心的library,它具有下列幾個重要特色:

  • 提供非常高效能的多維陣列(multi-dimensional array)數學函式庫
  • 可整合C/C++及Fortran的程式碼
  • 方便有用的線性代數(Linear Algebra)及傅立葉轉換(Fourier Transform)能力
  • 利用NumPy Array替代Python List
  • 可定義任意的數據型態(Data Type),使得能輕易及無縫的與多種資料庫整合

在邁向資料科學(Data Science)、機器學習(Machine Learning)、深度學習(Deep Learning)及人工智慧(Artificial Intelligence)的路上, Python還有許許多多有趣好玩的套件(例如:Pandas、SciPy、Sympy、Matplotlib、Scikit-learn 等),這些與資料科學相關的重要套件幾乎都是架構在 Numpy基礎上做應用,因此學會NumPy對後續的學習及理解將會有很大的幫助。

NumPy Fundamentals

在介紹NumPy基礎操作前,必須先進行import NumPy的動作,才能使用其函式庫內的相關功能,大家可以在Python IDLE中的Shell環境中試著輸入下方式子:

>>> import numpy as np

接下來我們將依序對一些基本及重要的功能逐一介紹。

1.NumPy Array

學習資料科學(Data Science)或機器學習(Machine Learning)時,利用NumPy在陣列的操作是非常重要,其主要功能都架構在多重維度(N-dimensional array)的 ndarray上,ndarray是一個可以裝載相同類型資料的多維容器,維度的大小及資料類型分別由shape及dtype來定義。通常我們會稱一維陣列為向量(vector),二維陣列為矩陣(matrix),未來在機器學習系列文章中會再仔細介紹此一部分。而一維陣列到多維陣列的各軸向(axis)可參考下圖,對於後續學習幫助很大。

[caption id=”attachment_17" align=”alignnone” width=”1698"]

陣列維度(Dimension)及軸向(axis)[/caption]

  • 建立陣列及初始值

我們會先import numpy 模組,透過傳入Python的list或tuple到 numpy.array() 建立陣列。

>>> import numpy as np
>>> a = np.array([1, 2, 3, 4]) #一維陣列建立
>>> b = np.array([(2.5, 1, 3, 4.5), (5, 6, 7, 8)], dtype = float) #二維陣列建立
>>> c = np.array([[(2.5, 1, 3, 4.5), (5, 6, 7, 8)], [(2.5, 1, 3, 4.5), (5, 6, 7, 8)]], dtype = float) #三維陣列建立

下面幾種方式除了可以建立陣列外,也可以同時給予初始值

>>> np.zeros((2, 3))               # 建立一個2x3全為0的陣列
>>> np.ones((2, 3, 4)) # 建立一個2x3x4全為1的陣列
>>> np.arange(1, 10, 2) # 建立一個由1開始,不超過10,間隔值為2的均勻數值陣列
>>> np.linspace(0, 10, 5) # 建立一個0到10之間,均勻的5個數值陣列
>>> np.full((3,2), 8) # 建立一個3x2全為8的陣列
>>> np.eye(2) # 建立一個5x5的單位矩陣
>>> np.random.random((2,3)) # 建立一個2x3的隨機值矩陣

2.I/O

>>> import numpy as np
>>> original_array = np.array([1, 2, 3])
>>> np.save('my_array', original_array)
>>> np.savetxt('my_array.txt', original_array)
>>> array_from_npy = np.load('my_array.npy')
>>> print(array_from_npy)
[1 2 3]
>>> array_from_txtfile = np.loadtxt('my_array.txt')
>>> print(array_from_txtfile)
[1. 2. 3.]

3.Data Types

NumPy支援比Python更多的數字類型。可參考下圖。

[caption id=”attachment_19" align=”alignnone” width=”866"]

NumPy Data Type (圖片來源:scipy.org)[/caption]

其中有5種基本數字類型比較常用,分別是booleans (bool), integers (int), unsigned integers (uint), floating point (float)和complex。

>>> np.array([1.2, 3, 5.2], dtype='i')
array([1, 3, 5], dtype=int32)
>>> np.array([1, 2, 3], dtype='f')
array([1., 2., 3.], dtype=float32)
>>> x = np.float32(1)
>>> x
1.0
>>> y = np.int_([1.0, 2.3])
>>> y
array([1, 2])

4.Inspecting Your Array

>>> a = np.array([1, 2, 3])
>>> b = np.array([(2.5, 1, 4.5), (5, 6, 7, 8)])
>>> a.shape # Array dimensions
(3,)
>>> len(a) # Length of array
3
>>> len(b) # Length of array
2
>>> b.ndim # Number of array dimensions
1
>>> a.size # Number of array elements
3
>>> b.size # Number of array elements
2
>>> b.dtype # Data type of array elements
dtype('O')
>>> a.dtype # Data type of array elements
dtype('int32')
>>> b.dtype.name # Name of data type
'object'
>>> a.dtype.name # Name of data type
'int32'
>>> a.astype(float) # Convert an array to a different type
array([1., 2., 3.])

5.Asking For Help

>>> np.info(max)
max(iterable, *[, default=obj, key=func]) -> value
max(arg1, arg2, *args, *[, key=func]) -> value
With a single iterable argument, return its biggest item. The
default keyword-only argument specifies an object to return if
the provided iterable is empty.
With two or more arguments, return the largest argument.
>>> np.info(np.ndarray.dtype)
Data-type of the array's elements.
Parameters
----------
None
Returns
-------
d : numpy dtype object
See Also
--------
numpy.dtype
Examples
--------
>>> x
array([[0, 1],
[2, 3]])
>>> x.dtype
dtype('int32')
>>> type(x.dtype)
<type 'numpy.dtype'>

6.Array Mathematics

  • Arithmetic Operations
>>> a = np.array([1, 2, 3])
>>> b = np.array([2, 4, 6])
>>> np.add(a, b) # 陣列加法,也可以a + b
array([3, 6, 9])
>>> np.subtract(a, b) # 陣列減法,也可以a – b
Array([-1, -2, -3])
>>> np.multiply(a, b) # 陣列乘法,也可以a * b
Array([ 2, 8, 18])
>>> np.divide(a, b) # 陣列除法,也可以a / b
array([0.5, 0.5, 0.5])
除了四則運算之外,也可以對陣列做其他的算術運算
>>> c = np.array([1, 4, 9])
>>> np.sqrt(c)
array([1., 2., 3.])
>>> np.sin(c)
array([ 0.84147098, -0.7568025 , 0.41211849])
>>> np.cos(c)
array([ 0.54030231, -0.65364362, -0.91113026])
>>> np.log(c)
array([0. , 1.38629436, 2.19722458])
  • Comparison

NumPy也提供Array幾種比較方式如下:

>>> a = np.array([(1, 2, 3), (4, 5, 6)])
>>> b = np.array([(1, 3, 3), (4, 7, 6)])
>>> c = np.array([(1, 2, 3), (4, 5, 6)])
>>> a == b # Element-wise comparison
array([[ True, False, True],
[ True, False, True]])
>>> a < 3 # Element-wise comparison
array([[ True, True, False],
[False, False, False]])
>>> np.array_equal(a, b) # Array-wise comparison
False
  • Aggregate Functions

利用numpy的聚合函數(Aggregate Functions)於統計領域是很方便的,常見聚合函數有最大值(max)、最小值(min)、中位數( median)、平均數(mean)、方差、標準差(std)、在numpy的使用上是很常見的。

>>> a = np.array([2, 5, 7])
>>> b = np.array([(0, 1), (2, 3)])
>>> a.sum() # Array-wise sum
14
>>> a.max() # Array-wise maximum value
7
>>> a.min() # Array-wise minimum value
2
>>> b.max(axis=0) # Maximum value of an array row
array([2, 3])
>>> b.max(axis=1) # Maximum value of an array row
array([1, 3])
>>> np.median(a) # Median
5.0
>>> np.mean(a) # Mean
4.666666666666667
>>> np.std(a) # Standard deviation
2.0548046676563256

7.Copying & Sorting Arrays

numpy同時提供多種陣列間的copying及sorting功能,我們就先簡介其中幾種做法。

>>> a = np.array([5, 13, -5, -2, 3, 4, 7])
>>> a.sort()
>>> a
array([-5, -2, 3, 4, 5, 7, 13])
>>> b = np.copy(a)
>>> b
array([-5, -2, 3, 4, 5, 7, 13])

8.Subsetting, Slicing, Indexing

藉由下列範例你將會清楚了解Subsetting, Slicing及Indexing的應用。我們先試著各建立一個一維陣列(1D array)及二維陣列(2D array)如下:

>>> a = np.array([1, 2, 3, 4])
>>> b = np.array([(2.5, 1, 3, 4.5), (5, 6, 7, 8)])
  • Subsetting
>>> a[2]
3
>>> b[1, 3]
>>> 8.0
  • Slicing
>>> a[0 : 2]
array([1, 2])
>>> b[0 : 2, 1]
array([1., 6.])
>>> b[1, 0 : 2]
array([5., 6.])
>>> b[ : 1]
array([[2.5, 1. , 3. , 4.5]])
  • Boolean Indexing
>>> a[a < 4]
array([1, 2, 3])
  • Fancy Indexing
>>> b[[1, 1, 0, 0], [0, 2, 1, 0]]
array([5. , 7. , 1. , 2.5])

9.Array Manipulation

  • Transposing Array
>>> a = np.array([(1, 3, 5, 7), (2, 4, 6, 8)])
>>> a
array([[1, 3, 5, 7],
[2, 4, 6, 8]])
>>> b = np.transpose(a)
>>> b
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
>>> b.T
array([[1, 3, 5, 7],
[2, 4, 6, 8]])
  • Changing Array Shape
>>> a = np.array([(1, 3, 5, 7), (2, 4, 6, 8)])
>>> a
array([[1, 3, 5, 7],
[2, 4, 6, 8]])
>>> a.shape
(2, 4)
>>> a.ravel()
array([1, 3, 5, 7, 2, 4, 6, 8])
>>> a.reshape(4, 2)
array([[1, 3],
[5, 7],
[2, 4],
[6, 8]])
  • Adding/Removing Elements
>>> a = np.array([1, 2, 3, 4])     # 建立a陣列
>>> b = np.array([6, 7, 8, 9]) # 建立b陣列
>>> np.append(a, 5)
array([1, 2, 3, 4, 5])
>>> np.append(a, b)
array([1, 2, 3, 4, 6, 7, 8, 9])
>>> np.insert(a, 1, 0)
array([1, 0, 2, 3, 4])
>>> np.delete(b, [2])
array([6, 7, 9])
>>> a.resize((2,2))
>>> a
array([[1, 2],
[3, 4]])
  • Combining Arrays

利用NumPy將array間做彼此合併或連結的方法很多,這裡先簡單介紹一些常用的方式。

  • vstack:垂直方向合併
  • hstack:水平方向合併
>>> a = np.array([(1, 2), (3, 4)])
>>> b = np.array([(5, 6), (7, 8)])
>>> np.vstack((a, b)) # 垂直方向合併
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
>>> np.hstack((a, b)) # 水平方向合併
array([[1, 2, 5, 6],
[3, 4, 7, 8]])
  • concatenate (axis = 0):沿垂直方向合併
  • concatenate (axis = 1):沿水平方向合併
>>> np.concatenate((a, b), axis = 0)   # axis=0,沿垂直方向合併
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
>>> np.concatenate((a, b), axis = 1) # axis=1,沿水平方向合併
array([[1, 2, 5, 6],
[3, 4, 7, 8]])
  • Splitting Arrays

跟Combining Arrays一樣,NumPy提供一些在不同軸向的切割方式,如下說明:

  • vsplit:垂直方向分割
  • hsplit:水平方向分割
>>> a = np.array([(1, 2, 3, 4, 5, 6), (-1, -2, -3, -4, -5, -6), (2, 4, 6, 8, 10, 12)])
>>> a
array([[ 1, 2, 3, 4, 5, 6],
[-1, -2, -3, -4, -5, -6],
[ 2, 4, 6, 8, 10, 12]])
>>> np.vsplit(a, 3) # 垂直方向分割
[array([[1, 2, 3, 4, 5, 6]]), array([[-1, -2, -3, -4, -5, -6]]), array([[ 2, 4, 6, 8, 10, 12]])]
>>> np.hsplit(a, 2) # 水平方向分割
[array([[ 1, 2, 3],
[-1, -2, -3],
[ 2, 4, 6]]), array([[ 4, 5, 6],
[-4, -5, -6],
[ 8, 10, 12]])]
>>> np.split(a, 3, axis=0) # axis=0,沿垂直方向分割
[array([[1, 2, 3, 4, 5, 6]]), array([[-1, -2, -3, -4, -5, -6]]), array([[ 2, 4, 6, 8, 10, 12]])]
>>> np.split(a, 2, axis=1) # axis=1,沿水平方向分割
[array([[ 1, 2, 3],
[-1, -2, -3],
[ 2, 4, 6]]), array([[ 4, 5, 6],
[-4, -5, -6],
[ 8, 10, 12]])]

跟上時代,現代人需要學Python的五大理由

 

人工智慧發展如日中天,如何和電腦對話逐漸成為現代人必備的技能之一。特別的是,最新出爐的108課綱首度將程式語言納入中學課程,政府將「與電腦對話的能力」視為未來台灣重要的競爭力,開始向下扎根;對於白領工作者而言,透過程式語言工具為自己加值,更是近幾年的大趨勢。

然而,程式語言百百種,而且並非所有人都具有資工、程式背景,找到一個好入門、易上手的工具就非常重要!Python是近幾年高速成長並且逐漸普及的程式語言,知名程式設計交流網站Stackoverflow大膽直言,Python將會取代其他程式語言,成為全世界最快速成長與廣泛使用的語言。

同時,Python也被視為執行機器學習最好的程式語言。換句話說,如果想要進入人工智慧領域,Python是最好入門的工具。因此,Python為何如此熱門?

理由一:容易學、好上手

Python對於新手而言是相對容易學習與上手,也可以說是最容易使用的程式語言之一,主要在於它的語法是簡化而不複雜的,同時強調自然語言,更貼近使用者的習慣。由於Python降低了操作門檻,因此跟其他程式語言相比,可以更輕鬆且快速執行。

Python是在1980年代由荷蘭電腦工程師吉多·范羅蘇姆(Guido van Rossum)所開發,他當時設計的初衷,就是希望將Python設計成具通用、普遍性的語言,即使是業餘開發人員也可以輕鬆閱讀和理解。

理由二:成熟且具支持性的Python社群

經過三十年的養成,Python的社群已經成長茁壯,有足夠的能量可以支持從初階入門者到專家級別的開發人員。這個社群提供了大量有關Python語言的文件、指引和教學影片,讓不同級別或年紀的學習者與開發人員都可以使用,增強他們在撰寫Python程式所需的知識。

任何一個程式語言,如果缺少了開發人員所提供的文件或支持,那麼它就很難被廣泛使用。Python就沒有這類的問題,因為它已經存在很長的時間,而且是最活躍的程式語言社群之一。這也意味著,如果有人對Python有疑問,他們可以從社群裡來自不同地方的開發人員獲得即時性的支持。

理由三:上百個Python函式庫與框架

因為背後強大的社群,Python有上百個出色的函式庫供開發者來使用,這可以大幅節省開發初期所耗費的時間與精力。除此之外,許多雲端服務供應商也以類似函式庫的方式提供跨平台支援的工具,這對開發者來說,是非常大的助益。

另外,還有許多專精於特定用途的函式庫,例如專門處理自然語言的NLTK(natural language toolkit),或是應用於機器學習的 scikit-learn,都可以透過Python來操作。

除此之外,還有許多函式庫與框架可以透過Python處裡,例如:

  • 適用於繪製圖表的matplotib
  • 適用於工程應用、科學和數學的SciPy
  • 適用於HTML解析和XML的BeautifulSoup
  • 適用於科學計算的NumPy
  • 適用於服務器端Web開發的Django

理由四:多功能、可靠性與速度

若是詢問任何一位使用Python寫程式的開發人員,他們會完全同意Python是一個可靠的工具,而且比大多數市面上的程式語言還要快速。Python幾乎可以在任何類型的環境中使用,而且無論使用哪種平台,幾乎不會遇到任何效能損失的問題。

談到Python的多功能性,它可以在多種環境中使用,例如移動應用程式、電腦應用程式、網頁開發,以及硬體程式等。也因為它擁有大量的應用程式,Python的多功能性對使用者來說更具吸引力。

理由五:大數據、機器學習與雲端運算

雲端運算、機器學習和大數據是今天電腦科學界最熱門的趨勢,它們可以幫助許多企業改變和優化工作流程。相較於R語言,Python被認為更具通用性,成為數據科學和分析最受歡迎的工具,目前許多企業進行數據處理、分析的工作,都是以Python來進行。

不僅如此,每天都有成千上萬的機器學習專案正在使用數百個Python函式庫,例如用於神經網路的TensorFlow和用於電腦視覺OpenCV等。

人人學Python已經是未來的趨勢,它的易用性、多功能與廣泛應用,賦予許多非本科系的學生、白領工作者握有進入人工智慧領域的鑰匙。因此專家也建議,培養與機器對話的能力,不論未來機器人如何發展,都有十足的信心不被取代,而且如虎添翼。

  • 台灣人工智慧學校技術領袖培訓班課程熱烈報名中:/category/opening/
  • Python 標準函式庫 (Standard Library

    Python 標準函式庫 (Standard Library) — Python 3.12.0a3 說明文件 ...