Python-numpy arrays 介紹

溯言|Rhett Caen Lv4

用numpy紀錄資料的特色

  • 相較於原本的Python List, 可以直接向量化、矩陣運算方便
  • 利用C API做計算,在矩陣運算上相較於原生的Python快
  • 從零開始為Index(跟C一樣)

Numpy 資料型態 (Data types)

.dtype (測試array資料型態)

1
2
3
4
5
# 從0開始到4塞入一個5x1的矩陣裡
import numpy as py
a = arange(5)
In: a.dtype
Out: dtype('int64')

簡易資料型態區分

相較於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-6
a[:7:2] => 0-7, 間隔為2
a[::-1] =>倒著輸出


:若下列函數並不取於變數本身(e.g. a.shape),則其命名空間皆為numpy(需要輸入 import numpy as np)
e.g.

1
2
3
4
import numpy as np
a = arange(3)
b = a*2
print(np.vstack((a,b))

矩陣變形操作 (Manipulating array shape)

.shape (測試每個維度的矩陣數)

1
2
3
4
In: a
Out: array([0, 1, 2, 3, 4])
In: a.shape
Out: (5,)

.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
2
3
a = np.arange(9).reshape(3,3)
np.hsplit(a,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
2
3
4
5
b = arange(4).reshape(2,2)

f = b.flat

for item in f: print item

取值 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)
轉成complex
b.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 進行許可。