MaDi's Blog

一個紀錄自己在轉職軟體工程師路上的學習小空間

0%

Numpy常用語法整理

什麼是Numpy?

Python中有很多套件可以使用,numpy是最常用的其中之一,擅長處理數據計算,舉凡是矩陣、陣列、多重維度的計算都可以透過numpy這個套件來完成,它的底層是以C和Fortran來實作,所以運算速度更快,也具備平行處理的能力,可以將操作動作一次套用在大型陣列上,與其他重量級套件(如:pandas,SciPy,Scikit-Learn)共同組成資料科學的堅強後盾。

為了避免未來忘記numpy的語法,將一些常用到的語法記錄下來以供未來查閱~


Numpy基本語法

import numpy as np

基本建立矩陣:

np.array( [元素1,元素2..] )

1
2
3
demo = np.array([1,2,3])

array([1, 2, 3])

最大值/最小值:

陣列.max()/陣列.min()

1
2
demo.max() //3
demo.min() //1

最大值/最小值對應的index:

argmax()/argmin()

1
2
demo.argmax() //2
demo.argmin() //0

轉置

陣列.T

此方法僅二維以上矩陣有效果

1
2
3
4
demo = np.array([[1,2,3],[4,5,6])

array([[1, 2, 3],
[4, 5, 6]])
1
2
3
4
5
demo.T 

array([[1, 4],
[2, 5],
[3, 6]])

一維陣列轉置

一維陣列轉置得靠newaxis

1
2
3
demo = np.array([1,2,3])

array([1, 2, 3])

陣列[ : , np.newaxis]

col方向增加維度

1
2
3
4
5
a[:,np.newaxis]

array([[1],
[2],
[3]])

陣列[np.newaxis , : ]

row方向增加維度

1
2
3
a[np.newaxis,:]

array([[1, 2, 3]])

1. 建立值全部都一樣的陣列

zeros(shape,dtype)

產生一個全部為零的陣列

1
2
3
np.zeros(10,dtype=int)

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

ones(shape,dtype)

產生一個全部為1的陣列

1
2
3
4
np.ones((2,4),dtype=float)

array([[1., 1., 1., 1.],
[1., 1., 1., 1.]])

empty(shape,dtype)

產生一個無初始值的陣列

1
2
3
np.empty((2,3))
array([[6.23042070e-307, 1.33512376e-306, 1.11261230e-306],
[7.56577399e-307, 9.34600963e-307, 5.63234836e-322]])

full(shape,N)

產生一個填滿N值的陣列

1
2
3
4
5
np.full((3,5),2)

array([[2, 2, 2, 2, 2],
[2, 2, 2, 2, 2],
[2, 2, 2, 2, 2]])

2. 建立等差數列

arange(start,stop,step,dtype)

step為等差值,可為float

1
2
3
np.arange(-2,10,2, dtype=int)

array([-2, 0, 2, 4, 6, 8])

linspace(start,stop,num)

num為陣列大小,均分成幾等分

1
2
3
np.linspace(0,10,5)

array([ 0. , 2.5, 5. , 7.5, 10. ])

3. 建立0~1的隨機數列

random.random(size)

random.ranf(size)

random.sample(size)

這三個方法效果一樣

建立一個size大小,0~1之間取亂數的陣列

1
2
3
4
5
random.random((3,3))

array([[0.66540127, 0.99804437, 0.56816777],
[0.59407879, 0.84882381, 0.22005514],
[0.84257899, 0.91811251, 0.74945698]])

4. 建立常態分布(高斯分布)的隨機陣列

random.normal(loc, scale, size)

loc: 平均值
scale: 標準差
size: 陣列大小

1
2
3
np.random.normal(3,2,5)

array([-0.65926963, 4.881109 , 5.16259178, 2.49724803, 3.84526978])

5. 建立隨機整數陣列

random.randint(low, high, size)

low: 最小值
high: 最大值
size: 陣列大小

1
2
3
4
5
np.random.randint(0,10,(3,3))

array([[7, 5, 9],
[2, 9, 1],
[6, 7, 8]])

6.陣列屬性

先隨機建立一個陣列demo

1
2
3
4
demo = np.random.randint(0,10,(2,3))

array([[3, 3, 9],
[7, 9, 9]])

ndim

陣列的維度數量

1
2
demo.ndim
3

size

陣列的元素數量

1
2
demo.size
6

shape

陣列的形狀

1
2
demo.shape
(2,3)

dtype

陣列的資料型態

1
2
demo.dtype
dtype('int32')

7. 陣列切片(Slice)

先隨機建立一個陣列demo

1
2
3
4
5
demo = np.random.randint(0,10,(3,3))

array([[0, 7, 6],
[8, 4, 4],
[8, 5, 7]])

陣列[row,col]

1
2
demo[1,2]
4

陣列[:,N]

取陣列第N行

1
2
3
demo[:,1]

array([7, 4, 5])

陣列[N,:]

取陣列第N列

1
2
3
demo[2,:]

array([8, 5, 7])

陣列[row1 : row2, col1 : col2]

row1:row2 代表取哪幾列
col1:col2 代表取哪幾行
:N 預設從0開始數到N-1

1
2
3
4
demo[1:3,:2]

array([[8, 4],
[8, 5]])

8.重塑(reshape)

先隨機建立一個陣列

1
2
3
4
demo = np.random.randint(0,100,(2,4))

array([[ 4, 54, 54, 42],
[93, 12, 96, 69]])

reshape(row,col)

1
2
3
4
5
6
demo.reshape(4,2)

array([[ 4, 54],
[54, 42],
[93, 12],
[96, 69]])

當維度數字太醜無法自己換算是幾乘幾的時候,可以採用-1,給程式自己算

1
2
3
demo.reshape(-1,8)

array([[ 4, 54, 54, 42, 93, 12, 96, 69]])

9. 串接

先隨機建立兩個陣列

1
2
3
4
5
6
7
8
9
x = np.random.randint(0,100,(2,3))

array([[99, 5, 25],
[74, 37, 0]])

y = np.random.randint(0,100,(2,3))

array([[76, 99, 5],
[16, 75, 63]])

concatenate( [陣列1,陣列2,陣列3…] ,axis)

串接的兩個陣列在串接的方向上必須是同維度

axis=0代表以方向串接

x
y

axis=1代表以方向串接

x y
1
2
3
4
np.concatenate([x,y],axis=1)

array([[99, 5, 25, 76, 99, 5],
[74, 37, 0, 16, 75, 63]])

vstack( [陣列1,陣列2,陣列3…] )

concatenate(axis=0)

1
2
3
4
5
6
np.vstack([x,y])

array([[99, 5, 25],
[74, 37, 0],
[76, 99, 5],
[16, 75, 63]])

hstack( [陣列1,陣列2,陣列3…] )

concatenate(axis=1)

1
2
3
4
np.hstack([x,y])

array([[99, 5, 25, 76, 99, 5],
[74, 37, 0, 16, 75, 63]])

10. 分割

先隨機建立一個陣列

1
2
3
4
demo = np.random.randint(0,10,(2,6))

array([[4, 9, 5, 2, 7, 2],
[2, 5, 0, 8, 4, 9]])

split(陣列,等分數量,axis)

等量分割,若不等量會噴錯

1
2
3
4
5
6
7
8
a1,a2,a3 = np.split(demo,3,axis=1)

a1 = array([[4, 9],
[2, 5]])
a2 = array([[5, 2],
[0, 8]])
a3 = array([[7, 2],
[4, 9]])

array_split(陣列,切分數量,axis)

不等量分割

以下例子分隔成數量 2,2,1,1

1
2
3
4
5
6
7
8
9
10
a1,a2,a3,a4 = np.array_split(demo,3,axis=1)

a1 = array([[4, 9],
[2, 5]])
a2 = array([[5, 2],
[0, 8]])
a3 = array([[7],
[4]])
a4 = array([[2],
[9]])

vsplit(陣列,切分數量)

只能等量分割垂直上下拉開

split(陣列,等分數量,axis=0)

1
2
3
4
a1,a2 = np.vsplit(demo,2)

a1 = array([[4, 9, 5, 2, 7, 2]])
a2 = array([[2, 5, 0, 8, 4, 9]])

hsplit(陣列,切分數量)

只能等量分割水平左右拉開

split(陣列,等分數量,axis=1)

1
2
3
4
5
6
7
8
a1,a2,a3 = np.hsplit(demo,3)

a1 = array([[4, 9],
[2, 5]])
a2 = array([[5, 2],
[0, 8]])
a3 = array([[7, 2],
[4, 9]])

11. 排序

先隨機建立兩個陣列,一個是一維陣列,另一個是二維陣列

1
2
3
4
5
6
arr1 = np.array([3,1,6])
// array([3, 1, 6])

arr2 = np.array([[2,3],[1,2]])
// array([[2, 3],
[1, 2]])

np.argsort(陣列)

回傳陣列由小到大排序後的index
np.argsort(-陣列): index倒序

1
2
np.array(arr1)  // array([1, 0, 2])
np.array(-arr1) // array([2, 0, 1])

二維陣列排序

axis=0: 按列來排(不同列之間做比較)
axis=1: 按行來排(不同行之間做比較)

1
2
3
4
np.argsort(arr2, axis=0)

// array([[1, 1],
[0, 0]])
1
2
3
4
np.argsort(arr2, axis=1)

// array([[0, 1],
[0, 1]])

12. Numpy其他函式

(節錄至[Day08]Learning Numpy - Ufuncs、broadcasting、運算子)

參考: