Numpy的基礎入門

Numpy 是 Python 的一個重要模組,主要用於資料處理上。Numpy 底層以 C 和 Fortran 語言實作,所以能快速操作多重維度的陣列。支援高階大量的維度陣列與矩陣運算,此外也針對陣列運算提供大量的數學函式函式庫。

當 Python 處理龐大資料時,其原生 list 效能表現並不理想(但可以動態存異質資料),而 Numpy 具備平行處理的能力,可以將操作動作一次套用在大型陣列上。此外 Python 其餘重量級的資料科學相關套件(例如:Pandas、SciPy、Scikit-learn 等)都幾乎是奠基在 Numpy 的基礎上。


Numpy 的重點在於陣列的操作,其所有功能特色都建築在同質且多重維度的 ndarray(N-dimensional array)上。ndarray 的關鍵屬性是維度(ndim)、形狀(shape)和數值類型(dtype)。 一般我們稱一維陣列為 vector 而二維陣列為 matrix。一開始我們會引入 numpy 模組,透過傳入 list 到 numpy.array() 創建陣列。

建立陣列

>>> import numpy as np
>>> x = np.array([1, 2, 3])
>>> x
array([1, 2, 3])
>>> y = np.arange(10)  # 類似 Python 的 range, 但是回傳 array
>>> y
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

基本運算

>>> a = np.array([1, 2, 3, 6])
>>> b = np.linspace(0, 2, 4)  # 建立一個array, 在0與2的範圍之間讓4個點等分
>>> c = a - b
>>> c
array([ 1.        ,  1.33333333,  1.66666667,  4.        ])
>>> a**2
array([ 1,  4,  9, 36])


運算子

說明

舉例

結果

+

A=6+3

A=9

-

A=6-3

A=3

*

A=6*3

A=18

/

浮點除法

A=7/3

A=3.5

//

整數除法(去除小數點)

A=7//2

A=3

%

相除後求餘數

A=7%2

A=1

**

次方

A=3**2 

A=9


運算子

說明

範例

縮寫

+=

A=A+2 

A += 2

-=

A=A-2 

A -= 2

*=

A=A*2 

A *= 2

/=

浮點除法

A=A/2  

A /= 2

//=

整數除法(去除小數點)

A=A//2

A //= 2

%=

相除後求餘數

A=A%2 

A %= 2

**=

次方

A=A**2

A **= 2


全域方法

>>> a = np.linspace(-np.pi, np.pi, 100) 
>>> b = np.sin(a)
>>> c = np.cos(a)

線性代數

>>> from numpy.random import rand
>>> from numpy.linalg import solve, inv
>>> a = np.array([[1, 2, 3], [3, 4, 6.7], [5, 9.0, 5]])
>>> a.transpose()
array([[ 1. ,  3. ,  5. ],
       [ 2. ,  4. ,  9. ],
       [ 3. ,  6.7,  5. ]])
>>> inv(a)
array([[-2.27683616,  0.96045198,  0.07909605],
       [ 1.04519774, -0.56497175,  0.1299435 ],
       [ 0.39548023,  0.05649718, -0.11299435]])
>>> b =  np.array([3, 2, 1])
>>> solve(a, b)  # 解方程式 ax = b
array([-4.83050847,  2.13559322,  1.18644068])
>>> c = rand(3, 3)  # 建立一個 3x3 隨機矩陣
>>> c
array([[  3.98732789,   2.47702609,   4.71167924],
       [  9.24410671,   5.5240412 ,  10.6468792 ],
       [ 10.38136661,   8.44968437,  15.17639591]])
>>> np.dot(a, c)  # 矩陣相乘
array([[  53.61964114,   38.8741616 ,   71.53462537],
       [ 118.4935668 ,   86.14012835,  158.40440712],
       [ 155.04043289,  104.3499231 ,  195.26228855]])

Numpy 陣列

Numpy 的重點在於陣列的操作,其所有功能特色都建築在同質且多重維度的 ndarray(N-dimensional array)上。ndarray 的關鍵屬性是維度(ndim)、形狀(shape)和數值類型(dtype)。 一般我們稱一維陣列為 vector 而二維陣列為 matrix。一開始我們會引入 numpy 模組,透過傳入 list 到 numpy.array() 創建陣列。

# 引入 numpy 模組
import numpy as np
np1 = np.array([1, 2, 3])
np2 = np.array([3, 4, 5])
# 陣列相加
print(np1 + np2) # [4 6 8]
# 顯示相關資訊
print(np1.ndim, np1.shape, np1.dtype) # 1 (3,) int64 => 一維陣列, 三個元素, 資料型別
np3 = np.array([1, 2, 3, 4, 5, 6])

(1)從檔案取資料

npd = np.genfromtxt('data.csv', delimiter=',')

(2)改變陣列維度

np3 = np3.reshape([2, 3])
print(np3.ndim, np3.shape, np3.dtype) # 2 (2, 3) int64

(3)改變陣列型別(bool、int、float、string)

bool 可以包含 True、False,int 可以包含 int16、int32、int64。其中數字是指 bits。float 可以包含 16、32、64 表示小數點後幾位。string 可以是 string、unicode。nan 則表示遺失值。

np3 = np3.astype('int64')
np3.dtype
# dtype('int64')


建立陣列

np1 = np.zeros([2, 3]) # array([[ 0.,  0.,  0.], [ 0.,  0.,  0.]])
np2 = np.ones([2, 3]) # array([[ 1.,  1.,  1.], [ 1.,  1.,  1.]])

(1)陣列索引與切片

一維陣列操作和 Python 原生 list 類似

np3 = np.array([1, 2, 3, 4, 5, 6])
print(np3[2]) # 3

二維陣列

np3 = np3.reshape([2, 3])
print(np3[1, 0]) # 4


(2)基本操作

使用布林遮罩來取值

np3 = np.array([1, 2, 3, 4, 5, 6])
print(np3 > 3) # [False False False  True  True  True]
print(np3[np3 > 3]) # [4 5 6]

加總

np3 = np3.reshape([2, 3])
print(np3.sum(axis=1)) # 將 axis=1 橫向加總 [6 15]

延伸參考資料

https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.loadtxt.html


https://docs.scipy.org/doc/numpy-1.13.0/user/basics.io.genfromtxt.html


https://www.numpy.org/devdocs/reference/generated/numpy.genfromtxt.html

0 條回復   |  直到 2019-3-17 | 486 次瀏覽




熱門評論


登入後才可發表內容