Python-numpy arrays 介紹
用numpy紀錄資料的特色
- 相較於原本的Python List, 可以直接向量化、矩陣運算方便
- 利用C API做計算,在矩陣運算上相較於原生的Python快
- 從零開始為Index(跟C一樣)
Numpy 資料型態 (Data types)
.dtype (測試array資料型態)
1 | # 從0開始到4塞入一個5x1的矩陣裡 |
簡易資料型態區分
相較於C++與C語言,Python並不需要先定義資料型態的特性(只需要先給值),給予了我們很多的方便。如果學過其他程式語言或是基本數學,應該能夠分辨出下面各種資料型態的差異以及使用時機。如果有需要的話可以用astype()去定義所需要的資料型態。
bool True or False
int (i, 8, 16, 32, 64, 共四種, i = Platform integer)
而 int8意思是總共有 ${2^8}$ 個儲存內容(-128,127)
e.g. int16
uint (8, 16, 32, 64, 共四種, 非負數)
e.g. uint8 (0,255)
float (11bits exponent, 52bits mantissa)
complex (64, 128orNon)
一維陣列部份選擇(選取)
a = arange(9) (總共有九個元素)a[3:7] => 3-6a[:7:2] => 0-7, 間隔為2a[::-1] =>倒著輸出
註:若下列函數並不取於變數本身(e.g. a.shape),則其命名空間皆為numpy(需要輸入 import numpy as np)
e.g.
1 | import numpy as np |
矩陣變形操作 (Manipulating array shape)
.shape (測試每個維度的矩陣數)
1 | In: a |
.reshape() (重新定義矩陣,但是不改變原值)
e.g. b = np.arange(24).reshape(2,3,4)
意思是 分成兩個大矩陣,每個大矩陣都有三個中矩陣,三個中矩陣底下又有四個小矩陣。也可以看成分成兩個大矩陣,然後分成3*4的矩陣(colomn=3, raw=4)
.resize() (重新定義矩陣並改變原值)
b.resize(2,3,4)
如同上面的reshape,只是差在於一個印出來結果,一個是直接改變變數值。
.ravel() & .flatten() (拉平矩陣)
如同上述的例子,如果一個矩陣是234,而這裡就會變成一個24格的矩陣。兩者的差異在於 .ravel 不會 分配新的記憶體給新的矩陣使用,而.flatten會分配新的記憶體給新的矩陣用。因此,使用.ravel函數 有可能會蓋過原本的函數資料。如果要將舊變數資料送至另外一個變數時,最好的方式是使用.flatten()將值分配給另外一個新矩陣。
e.g. b.ravel() or b.flatten()
.transpose (轉置)
b.transpose()
行列交換,自己認為這個功能滿常用的
多維矩陣(>=2)
m = array([arange(2), arange(2)])
直接矩陣給值
1 | a = array(([1,2],[3,4])) |
矩陣堆疊(Stacking Arrays)
主要有以下五個,使用方式為 .函數((a,b))
- hstack()
Horizental stacking - vstack()
Vetical stacking - dstack()
Depth stacking - column_stack()
- row_stack()
- concatenate()
水平、垂直堆疊(Horizontal, vertical stacking)
水平:.hstack((a,b)) or .concatenate((a,b), axis=1)
垂直: .vstack((a,b)) or .concatenate((a,b), axis=0)
深度堆疊(Depth stacking)
.dstack((a,b))
如果你的矩陣長是a = [[0,1],[1,2]]跟 b = [[2,3],[3,4]],深度堆疊後會變成這樣
array([[[0, 2], [1, 3]], [[1, 3], [2, 4]]])
看起來的意思就是把兩個一樣大小的矩陣相疊在一起之後所造成的,本來深度為1兩個加在一起之後深度為2。
柱堆疊(Column stacking)
.column_stack((a,b))
如果是一維,將會把兩個一維的矩陣拉成兩個列相加,如果是二維矩陣,則是如水平堆疊一樣。
行堆疊 (Raw stacking)
.row_stack((a,b))
水平堆疊摟~沒啥特別的。如果是二維的話就會跟.vstack()一樣。
矩陣分離(Splitting numpy array)
主要有以下四個,分別是水平(horizontal split, .hsplit())、垂直(vertical split(), vsplit())、深度(depth split, .dsplit())、跟分離(就是split())(axis=0 => 跟垂直分離一樣, axis=1 =>跟水平分離一樣)
- .hsplit()
所謂的水平分離是把矩陣的 水平方向切開。也就是說切到變成一條一條的柱子(應該是列吧)
e.g.
1 | a = np.arange(9).reshape(3,3) |
- .vsplit()
跟水平的相反,是切垂直的。 - .dsplit()
把每個有深度的矩陣都切出來變成單獨的。假設有個333的矩陣,用dsplit切成3 - .split()
ndarray特性整理
下面各種矩陣的變數都是在矩陣底下的點運算子做的(e.g. a.itemsize , 而a是矩陣變數)。
基本特性
- itemsize
顯示每個矩陣單位的大小 - size
顯示總共有幾個儲存格子(矩陣) - nbytes
總共用了多少個bytes(所以說itemsize*size = nbytes) - T
矩陣轉置,跟.transpose()是一樣的 - ndim
看你的矩陣有幾個維度摟,一般來說圖片是三維的2D矩陣+各自的(R,G,B)數值。
有虛數時專用
以下兩個是給有虛數的時候用的,取實部或者虛部的時候用的。
- imag
取虛部 - real
取實部
位置運算(flat)
- flat
這對應到c++就是所謂的位子運算子(也就是指標的概念)。 get a flatiter object
下列是利用.flat的運算,並且利用for迴圈將每個位子讀過並且印在銀幕上的小例子。
1 | b = arange(4).reshape(2,2) |
取值 b.flat[2]
將b矩陣的每個數值都改成7 b.flat=7
將b矩陣位置的[1,3]修改成1 b.flat[1,3]=1
型態強制轉換
主要有兩個,**tolist()**轉成python的list 跟 **astype()**指定型態轉換
以下有兩個例子,轉換成list b.tolist()
轉換成int矩陣 b.astype(int)
轉成complexb.astype('complex')
Note from the book Python Data Analysis -Ivan Idris
- 標題: Python-numpy arrays 介紹
- 作者: 溯言|Rhett Caen
- 撰寫於 : 2017-09-08 20:56:50
- 更新於 : 2017-09-12 00:00:00
- 連結: https://fractalrhythm.vercel.app/2017/09/08/py-numpy/
- 版權宣告: 本作品採用 CC BY-NC-SA 4.0 進行許可。