←前一篇 後一篇→
若是頭一擺來遮,建議先來踏話頭
陣列,矩陣,和 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 又閣是統計, 資料科學 ê 底蒂. 伊共真濟陣列个工具攢佮真好勢. 咱愛共伊用佮熟手, 通好來學閣較深个物!
kā 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 無關係.
來索引 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, 預設是共逐个元素總加起來
沒有留言:
張貼留言