1. 程式人生 > 實用技巧 >numpy筆記

numpy筆記

建立np陣列

import numpy as np
m = np.array([np.arange(2), np.arange(2)])
m

[[0, 1],
[0, 1]]

np.zeros((2,2)) # 建立一個值均為0的2*2矩陣

[[0., 0.],
[0., 0.]]

np.ones((1,2)) # 建立一個值均為1的1*2矩陣

[[1., 1.]]

np.full((2,2), 7) # 建立一個值均為7的2*2矩陣

([[7, 7],
[7, 7]]

np.eye(2) # 建立一個2*2單位矩陣

[[1., 0.],
[0., 1.]]

np.eye(3,k=1) # 第一個引數是矩陣的行/列數
# 第二個引數預設為0
# 若k>0,則從中心對角線起右上角第k條對角線全為1
# 若k<0,則從中心對角線起左下角第k條對角線全為1

[[0., 1., 0.],
[0., 0., 1.],
[0., 0., 0.]]

np.eye(4,k=2)

[[0., 0., 1., 0.],
[0., 0., 0., 1.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]]

np.random.random((2,2))

[[0.04065736, 0.35996263],
[0.40312977, 0.84368045]]

改變陣列維度

a = np.arange(8)
a.resize(2,4)
a

[[0 1 2 3],
[4 5 6 7]]

a = np.arange(8).reshape(2,4)
b = a.ravel() # 展平陣列
b[0] = -1 # ravel共享記憶體
a

[[-1, 1, 2, 3],
[ 4, 5, 6, 7]]

a = np.arange(8).reshape(2,4)
b = a.flatten() # 展平陣列
b[0] = -1 # flatten重新建立記憶體
a

[[0, 1, 2, 3],
[4, 5, 6, 7]]

a.T # 轉置,等同於a.transpose()

[[0, 4],
[1, 5],
[2, 6],
[3, 7]]

陣列的組合

a = np.arange(6).reshape(2,3)
b = a * 2
# 左右拼接
print(np.hstack((a,b)))
print(np.concatenate((a,b),axis=1))

[[ 0 1 2 0 2 4]
[ 3 4 5 6 8 10]]
[[ 0 1 2 0 2 4]
[ 3 4 5 6 8 10]]

# 上下拼接
print(np.vstack((a,b)))
print(np.concatenate((a,b),axis=0))

[[ 0 1 2]
[ 3 4 5]
[ 0 2 4]
[ 6 8 10]]
[[ 0 1 2]
[ 3 4 5]
[ 0 2 4]
[ 6 8 10]]

print(np.dstack((a,b))) # 深度組合,將一系列陣列沿著縱軸方向進行層疊組合

[[[ 0 0]
[ 1 2]
[ 2 4]]
[[ 3 6]
[ 4 8]
[ 5 10]]]

陣列的分割

a = np.arange(6).reshape(2,3)
np.split(a,3,axis=1) # 水平分成3個,等同於np.hsplit(a,3)

[[[0],
[3]],
[[1],
[4]],
[[2],
[5]]]

a = np.arange(6).reshape(2,3)
np.split(a,2,axis=0) # 垂直分成2個,等同於np.vsplit(a,2)

[([[0, 1, 2]]), [[3, 4, 5]])]

a = np.arange(6).reshape(1,2,3)
np.dsplit(a,3) # 深度方向分成3個,必須是三維陣列及以上

[[[[0],
[3]]],
[[[1],
[4]]],
([[[2],
[5]]]]

常用函式

a = np.array([[3,1,2],[0,5,4]])
np.sort(a,axis=1) # 按行升序

[[1, 2, 3],
[0, 4, 5]]

np.sort(a,axis=0) # 按列升序

[[0, 1, 2],
[3, 5, 4]]

-np.sort(-a,axis=1) # 按列降序

[[3, 2, 1],
[5, 4, 0]]

a = np.array([[3,1,2],[0,5,4]])
np.argmax(a) # 返回最大值的下標,可以理解為先展平成1維陣列,再尋找下標

4

b = np.array([np.nan, 2, 4])
print(np.argmax(b))
print(np.nanargmax(b)) # 忽略nan

0
2

a = np.array([[3,1,2],[0,5,4]])
np.argwhere(a <= 4) # 返回小於4的元素位置

[[0, 0],
[0, 1],
[0, 2],
[1, 0],
[1, 2]], dtype=int64)

a = np.arange(5)
indices = np.searchsorted(a, [-2,7]) # np.searchsorted(a,b) 返回將b插入a
#searchsorted函式:為指定的插入值尋找維持陣列排序的索引位置。該函式使用二分搜尋演算法。
#在不打亂a陣列排序結果基礎上插入b陣列,返回b陣列每個元素如果插入的話對應的位置。
print(indices)
print(np.insert(a, indices, [-2,7]))

[0 5]
[-2 0 1 2 3 4 7]

a = np.array([2,6,1,3])
print(np.median(a)) # 求中位數
print(np.mean(a))   # 求均值
print(np.var(a))    # 求方差
print(np.std(a))    # 求標準差

2.5
3.0
3.5
1.8708286933869707

np.diff(a) # 後一項減前一項

[ 4, -5, 2]

運算

a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
print("a.dot(b):\n", a.dot(b)) # 數乘
print("a @ b:\n", a @ b)       # 數乘
print("a * b:\n", a * b)       # 哈達瑪乘積 對應元素相乘
aMat = np.mat(a)
bMat = np.mat(b)
print("aMat * bMat:\n", aMat * bMat)

a.dot(b):
[[19 22]
[43 50]]
a @ b:
[[19 22]
[43 50]]
a * b:
[[ 5 12]
[21 32]]
aMat * bMat:
[[19 22]
[43 50]]