什麼是Numpy?
Python中有很多套件可以使用,numpy是最常用的其中之一,擅長處理數據計算,舉凡是矩陣、陣列、多重維度的計算都可以透過numpy這個套件來完成,它的底層是以C和Fortran來實作,所以運算速度更快,也具備平行處理的能力,可以將操作動作一次套用在大型陣列上,與其他重量級套件(如:pandas,SciPy,Scikit-Learn)共同組成資料科學的堅強後盾。
為了避免未來忘記numpy的語法,將一些常用到的語法記錄下來以供未來查閱~
Numpy基本語法
import numpy as np
基本建立矩陣:
np.array( [元素1,元素2..] )
1 | demo = np.array([1,2,3]) |
最大值/最小值:
陣列.max()/陣列.min()
1 | demo.max() //3 |
最大值/最小值對應的index:
argmax()/argmin()
1 | demo.argmax() //2 |
轉置
陣列.T
此方法僅二維以上矩陣有效果
1 | demo = np.array([[1,2,3],[4,5,6]) |
1 | demo.T |
一維陣列轉置
一維陣列轉置得靠newaxis
1 | demo = np.array([1,2,3]) |
陣列[ : , np.newaxis]
在
col
方向增加維度
1 | a[:,np.newaxis] |
陣列[np.newaxis , : ]
在
row
方向增加維度
1 | a[np.newaxis,:] |
1. 建立值全部都一樣的陣列
zeros(shape,dtype)
產生一個全部為零的陣列
1 | np.zeros(10,dtype=int) |
ones(shape,dtype)
產生一個全部為1的陣列
1 | np.ones((2,4),dtype=float) |
empty(shape,dtype)
產生一個無初始值的陣列
1 | np.empty((2,3)) |
full(shape,N)
產生一個填滿N值的陣列
1 | np.full((3,5),2) |
2. 建立等差數列
arange(start,stop,step,dtype)
step為等差值,可為float
1 | np.arange(-2,10,2, dtype=int) |
linspace(start,stop,num)
num為陣列大小,均分成幾等分
1 | np.linspace(0,10,5) |
3. 建立0~1的隨機數列
random.random(size)
random.ranf(size)
random.sample(size)
這三個方法效果一樣
建立一個size大小,0~1之間取亂數的陣列
1 | random.random((3,3)) |
4. 建立常態分布(高斯分布)的隨機陣列
random.normal(loc, scale, size)
loc: 平均值
scale: 標準差
size: 陣列大小
1 | np.random.normal(3,2,5) |
5. 建立隨機整數陣列
random.randint(low, high, size)
low: 最小值
high: 最大值
size: 陣列大小
1 | np.random.randint(0,10,(3,3)) |
6.陣列屬性
先隨機建立一個陣列demo
1 | demo = np.random.randint(0,10,(2,3)) |
ndim
陣列的維度數量
1 | demo.ndim |
size
陣列的元素數量
1 | demo.size |
shape
陣列的形狀
1 | demo.shape |
dtype
陣列的資料型態
1 | demo.dtype |
7. 陣列切片(Slice)
先隨機建立一個陣列demo
1 | demo = np.random.randint(0,10,(3,3)) |
陣列[row,col]
1 | demo[1,2] |
陣列[:,N]
取陣列第N行
1 | demo[:,1] |
陣列[N,:]
取陣列第N列
1 | demo[2,:] |
陣列[row1 : row2, col1 : col2]
row1:row2
代表取哪幾列col1:col2
代表取哪幾行:N
預設從0開始數到N-1
1 | demo[1:3,:2] |
8.重塑(reshape)
先隨機建立一個陣列
1 | demo = np.random.randint(0,100,(2,4)) |
reshape(row,col)
1 | demo.reshape(4,2) |
當維度數字太醜無法自己換算是幾乘幾的時候,可以採用
-1
,給程式自己算
1 | demo.reshape(-1,8) |
9. 串接
先隨機建立兩個陣列
1 | x = np.random.randint(0,100,(2,3)) |
concatenate( [陣列1,陣列2,陣列3…] ,axis)
串接的兩個陣列在串接的方向上必須是同維度
axis=0
代表以列
方向串接
x |
---|
y |
axis=1
代表以行
方向串接
x | y |
---|
1 | np.concatenate([x,y],axis=1) |
vstack( [陣列1,陣列2,陣列3…] )
同
concatenate(axis=0)
1 | np.vstack([x,y]) |
hstack( [陣列1,陣列2,陣列3…] )
同
concatenate(axis=1)
1 | np.hstack([x,y]) |
10. 分割
先隨機建立一個陣列
1 | demo = np.random.randint(0,10,(2,6)) |
split(陣列,等分數量,axis)
等量分割,若不等量會噴錯
1 | a1,a2,a3 = np.split(demo,3,axis=1) |
array_split(陣列,切分數量,axis)
不等量分割
以下例子分隔成數量
2,2,1,1
1 | a1,a2,a3,a4 = np.array_split(demo,3,axis=1) |
vsplit(陣列,切分數量)
只能等量分割,垂直上下拉開
同
split(陣列,等分數量,axis=0)
1 | a1,a2 = np.vsplit(demo,2) |
hsplit(陣列,切分數量)
只能等量分割,水平左右拉開
同
split(陣列,等分數量,axis=1)
1 | a1,a2,a3 = np.hsplit(demo,3) |
11. 排序
先隨機建立兩個陣列,一個是一維陣列,另一個是二維陣列
1 | arr1 = np.array([3,1,6]) |
np.argsort(陣列)
回傳陣列由小到大排序後的index
np.argsort(-陣列): index倒序
1 | np.array(arr1) // array([1, 0, 2]) |
二維陣列排序
axis=0
: 按列來排(不同列之間做比較)axis=1
: 按行來排(不同行之間做比較)
1 | np.argsort(arr2, axis=0) |
1 | np.argsort(arr2, axis=1) |
12. Numpy其他函式
(節錄至[Day08]Learning Numpy - Ufuncs、broadcasting、運算子)