2017年9月6日 星期三

Python Deep Learning 深學筆記 - Numpy

前一篇  後一篇

若是頭一擺來遮,建議先來踏話頭



陣列,矩陣,和 N 維陣列的觀念





陣列有 1, 2, ..., N 維陣列。數學共一維陣列號做向量 (ǹg-līong),二維陣列號做矩陣。向量抑是矩陣正規化了後,號做 Then-so(tensor,華語: 張量)。佇這本冊,二維陣列號做矩陣,三維以上號做Then-so抑是濟維陣列。


Numpy 是啥物?

Numpy 是一咧陣列 (numpy.array) 的 Module。因為咱踮深學會定定用著陣列(tin-lia̍t)抑是矩陣(kú-tīn)。

伊是利用 Python 來實作數學頂仔 ê Linear Algebra (線性代數/suànn-sìng-tāi-sòo) 上重要 ê 底蒂. Linear Algebra 又閣是統計, 資料科學 ê 底蒂伊共真濟陣列个工具攢佮真好勢. 咱愛共伊用佮熟手, 通好來學閣較深个物!

Numpy module 𤆬入來咱的程式真簡單:


>>> import numpy as np

產生陣列也蓋簡單, 就是共 Python 本成名單 (List), 用 np.array() 來共伊轉--過來:


>>> my_list = [1, 2, 3]
>>> arr = np.array(my_list)
>>> arr

伊的輸出是:


array([1, 2, 3])

你若斟酌看, 名單干焦是 [ 1, 2, 3]. array() 表示伊是 Numpy 个物件.
伊的預設型態是

>>> print(arr.dtype)
dtype('int64')


Numpy 拍底个方法 (Basic Methods)


Numpy 直接產生相連續的數列, 會使用 arange(start, stop):

>>> np.arange(0,10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.arange(0,11,2)
array([ 0,  2,  4,  6,  8, 10])

若是有第三个參數, 是代表偌濟个才揀一个. 2 就是兩的揀一个.閣有另一个輕可方法來產生數列就是 linspace.



linspace

>>> np.linspace(0,10,10)
array([  0.        ,   1.11111111,   2.22222222,   3.33333333,
         4.44444444,   5.55555556,   6.66666667,   7.77777778,
         8.88888889,  10.        ])

arange 無仝ê所在是: 第三的參數是指定欲產生幾个數字, 毋是欲躘偌濟, linspace 自動算出數字中方个距離.


0 陣列 (zeros):

>> np.zeros(3)
array(0., 0., 0.])
>> np.zeros((3,3))
array([[ 0.,  0.,  0.],
          [ 0.,  0.,  0.],
          [ 0.,  0.,  0.]])


1 陣列 (ones):

>> np.ones(3)
array(1., 1., 1.])
>> np.zeros((3,3))
array([[ 1.,  1.,  1.],
          [ 1.,  1.,  1.],
          [ 1.,  1.,  1.]])



目睭陣列 (eye, identity matrix)


>>> np.eye(3)
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])

亂數陣列

有幾落款个亂數函式. 予你真簡單就會當生亂數陣列出來:
>>> np.random.rand(3) 
array([ 0.04513197,  0.0986391 ,  0.88126089])

>>> np.random.rand(2,2)
array([[ 0.02991544,  0.04311185],
       [ 0.51475763,  0.59982047]])

>>> np.random.randn(3)
array([ 0.91825285, -0.05281746, -0.45268078])

>>> np.random.randint(1,100,10)
array([49, 72,  2, 94, 26, 53, 97, 51, 87, 64])

randn 是 standard normal distribution, 和普通是 uniform distribution 的亂數無仝.



陣列个型(Shape)

Shape 就是伊的維度 (dimension) 和逐个維度个大細个表誌. 一維陣列, 有 10 个元素个型就是 (1, 10). 毋過, 佇二維陣列來講, (1, 10) 和 (10, 1) 个型是無仝个:


>>> arr = np.arange(0,10)                 # 是 array
>>> arr.shape
(10,)                                     # 第二个是空个
>>> arr.reshape(1,10)
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
>>> arr.reshape(10,1)                     # 第二个是 1
array([[0],
       [1],
       [2],
       [3],
       [4],
       [5],
       [6],
       [7],
       [8],
       [9]])

咱會當看著: 若無經過 reshape(), 普通一維陣列是無第二的維度.  凡勢你會問: (10, ) 和 (10, 1)  毋是仝款? 無毋著, 毋過, Numpy 就按呢設計, 咱就愛知影伊的鋩角, 無你就會踢著鐵枋.



共濟維矩陣運算鋪平 (flatten)

咱嘛會使共陣列平,也就是共濟維陣列,成做一維陣列:

>>> A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9])
>>> A.flatten()
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

共一維陣列成做濟維陣列 (reshape)

會使鋪平, 嘛會用共伊轉--轉來(tsuán--tǹg-lâi), 就是用 reshape() 這个方法.



>>> arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> arr.reshape(3,3)
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])



Numpy 的索引和揀選(Indexing and Selection)

Numpy 的陣列, 佮 List 仝款, 上基礎个方法是用 [] 來揀選伊的元素:

>>> arr = np.arange(0,11)
>>> arr[8]
8
>>> arr[1:5]
arrray([0, 1, 2, 3, 4]) 

List 的 Slice, 嘛會用之. 紲落來是和 List 無仝个所在


楦大(Broadcasting)

兩的陣列運算,有時無仝維度。這時,Numpy 會自動共少維度 ê 彼个陣列闊,予伊和較懸的維度 ê 陣列仝款,就會當做對應元素(element-wise)。舉例:


>>> arr * 3
array([ 0,  3,  6,  9, 12, 15, 18, 21, 24, 27, 30])

是 [ 3., 6., 9.] * 3 --> [ 3., 6., 9.] * [ 3, 3, 3]。雖然 3 是純量(scalar),算是 0 維。毋閣已經人(hông)做一維陣列,就會當做 element-wise 計算


>>> arr[1:5]= 100
>>> arr
array([  0, 100, 100, 100, 100,   5,   6,   7,   8,   9,  10])

就算是 Slice, 也是會佮 100 楦大做 array 才一捆囥入去.

Khok-pì 抑是視角 (Copy or View)


這是 Numpy 陣列和 List 一个重要个無仝:
>>> arr = np.arange(0,11)
>>> a_slice = arr[0:4]
>>> a_slice[:] = 99
>>> arr
array([99, 99, 99, 99,  4,  5,  6,  7,  8,  9, 10])

咱明明是改 a_slice, 哪會改著 arr? 原來你鉸一塊 slice, 窮實是仝一个 Numpy 陣列个視角, 就親像用譀鏡來看物件, 干焦看著一部分.

欲按怎 Khok-pì 另一無仝个物件咧? Numpy 有準備一个 copy() 予你用:

>>> a_copy = arr.copy()

a_copy 就和 arr 無關係.




索引 2D 陣列

先來幾个簡單个例:

>>> arr_2d = np.array(([5,10,15],[20,25,30],[35,40,45]))
>>> arr_2d
array([[ 5, 10, 15],
       [20, 25, 30],
       [35, 40, 45]])

>>> arr_2d[1]
array([20, 25, 30])

>>> arr_2d[1][2]
30

>>> arr_2d[1, 2]
30

這真簡單. 伊為著欲方便, 也支援肚胿仔號 (,). 閣會使 2維个切片(Slicing):

>>> arr_2d[1:][:2]
array([[20, 25, 30],
       [35, 40, 45]])

索引 (Fancy Indexing)

啥乜是奅个索引? 伊是予你會使予你隨意揀欲挃个列(row)抑是逝(column), 共in鬥起來成做新个陣列. 予咱會當真緊來起一个陣列.

arr2d = np.zeros((10,10))
arr_length = arr2d.shape[1]
for i in range(arr_length):
    arr2d[i] = i
    
arr2d

你會看著伊是:
array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.],
       [ 3.,  3.,  3.,  3.,  3.,  3.,  3.,  3.,  3.,  3.],
       [ 4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.],
       [ 5.,  5.,  5.,  5.,  5.,  5.,  5.,  5.,  5.,  5.],
       [ 6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.],
       [ 7.,  7.,  7.,  7.,  7.,  7.,  7.,  7.,  7.,  7.],
       [ 8.,  8.,  8.,  8.,  8.,  8.,  8.,  8.,  8.,  8.],
       [ 9.,  9.,  9.,  9.,  9.,  9.,  9.,  9.,  9.,  9.]])

咱講个奅, 是會使用 List 當做參數, 來揀選咱欲挃的列, 而且, 免照順序:

>>> arr2d[[1, 6,4,2]]
array([[ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.],
       [ 4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.],
       [ 2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.]])


个揀選 (Fancy Selection)

伊有一種奅个方式來揀選元素, 免用一堆 if, else.

>>> arr = np.arange(1,11)
>>> arr_bool= arr > 4
>>> arr_bool
array([False, False, False, False,  True,  True,  True,  True,  True,  True], dtype=bool)

arr > 4, 利用楦大 (Broadcasting), 咱得著一个齊是 True/False 个 Numpy array, 共這个囥入去原在个陣列:
>>> arr[arr_bool]
array([ 5,  6,  7,  8,  9, 10])

也就是: Boolean Numpy array 囥入 Numpy array 裡, 干焦 True 个位才會揀出來. 咱會使閣較屧貼:

>>> arr[arr>3]
array([ 4,  5,  6,  7,  8,  9, 10])

按呢一逝就會用之, 有奅--無?

Numpy 閣較濟个紹介

sum(axis=None,...)

若是無設 axis, 預設是共逐个元素總加起來


沒有留言:

佇 Linux 來看GPX 檔案

最近定定有戶外活動。使用𤆬路機 (GPS) 來記錄行過的路線。普通我記錄路線,攏是用手機仔抑是專門个𤆬路機,罕得用電腦來看。 毋過,"仙人拍鼓有時錯,跤步踏差啥人無"。有一擺我無細膩,袂記得共一擺活動的路線收煞起來,閣直接開始記錄下一擺的活動,按呢共幾落...