23. 圖像矩陣去掉一維 reshape(1, width*height).squeeze()
import numpy as np
import matplotlib.pyplot as plt
img_r = (plt.imread('1.gif')).astype(np.float64)
print(img_r.shape)
print(img_r[4][50]) # 老矩陣任取一點(diǎn)
img_r = img_r.reshape((1, img_r.shape[0] * img_r.shape[1], img_r.shape[2])).squeeze()
print(img_r.shape)
print(img_r[4 * 64 + 50]) # 新矩陣取同一點(diǎn)
(52, 64, 4)
[169. 167. 172. 255.]
(3328, 4)
[169. 167. 172. 255.]
22. 判斷兩個(gè)矩陣同一位置相等元素個(gè)數(shù)
import numpy as np
a = np.array([1,2,3,4])
b = np.array([2,2,3,3])
len(np.where(a==b)[0])
2
21. 注意:給矩陣中某列的某幾個(gè)元素賦值勿锅,別忘了
import numpy as np
x = np.diag([2,3,4]) # 對(duì)角陣
print(x)
idx = np.array([1,2])
x[0, idx] = 1 # 行賦值
print(x)
x[idx, 0] = 1 # 列賦值
print(x)
[[2 0 0]
[0 3 0]
[0 0 4]]
[[2 1 1]
[0 3 0]
[0 0 4]]
[[2 1 1]
[1 3 0]
[1 0 4]]
20. 求特征向量 np.linalg.eig
import numpy as np
x = np.diag((10,2,3)) # 對(duì)角陣
print(x)
eigen_vals, eigen_vecs = np.linalg.eig(x)
print(eigen_vals)
print(eigen_vecs)
可以看出,每一列表示一個(gè)特征向量
[[10 0 0]
[ 0 2 0]
[ 0 0 3]]
[10. 2. 3.]
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
還可以求得 按照特征值排序 的特征向量 np.linalg.eigh
枣氧,升序
eigen_vals, eigen_vecs = np.linalg.eigh(x) # 默認(rèn) L溢十,也可以設(shè)置為 U
print(eigen_vals)
print(eigen_vecs)
[ 2. 3. 10.]
[[0. 0. 1.]
[1. 0. 0.]
[0. 1. 0.]]
一般需要降序排列的特征向量,如 PCA达吞,可以 reverse 一下
print(eigen_vals[::-1])
reverse_idx = range(x.shape[0])[::-1]
print(eigen_vecs[:, reverse_idx])
[10. 3. 2.]
[[1. 0. 0.]
[0. 0. 1.]
[0. 1. 0.]]
19. np 矩陣 softmax 函數(shù)(一種歸一化的方法)
import numpy as np
z = np.array([1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0])
print(np.exp(z)/sum(np.exp(z)))
18. np 矩陣對(duì)每個(gè)元素實(shí)現(xiàn) relu = max(0, x) np.maximum
a = np.random.rand(2, 3) - 0.5
print(a)
print(np.maximum(0, a))
[[ 0.12902265 -0.26880289 -0.34555143]
[ 0.21141166 -0.130721 -0.4073654 ]]
[[0.12902265 0. 0. ]
[0.21141166 0. 0. ]]
17. np 矩陣排序反轉(zhuǎn)
k = 10
a = np.random.permutation(500)[:k]
print(a)
b = np.argsort(a)
print(b)
c = np.argsort(a)[::-1]
print(c)
[345 245 201 362 41 25 51 332 87 491]
[5 4 6 8 2 1 7 0 3 9]
[9 3 0 7 1 2 8 6 4 5]
16. np 矩陣統(tǒng)計(jì)整數(shù)個(gè)數(shù) np.bincount
只能計(jì)算整數(shù)數(shù)組张弛,將每個(gè)數(shù)字的值轉(zhuǎn)化成結(jié)果數(shù)組的 idx,結(jié)果數(shù)組中每個(gè)值表示相應(yīng) idx 的元素個(gè)數(shù)酪劫。
a = np.array([1, 10])
np.bincount(a)
array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1], dtype=int64)
15. np 矩陣增加一維
a = np.array([[2, 5, 7, 8, 9, 89], [6, 7, 5, 4, 6, 4]])
print(a.shape)
b = a[np.newaxis,:] # 可以添加在任何位置
print(b.shape)
print(a.shape)
(2, 6)
(1, 2, 6)
(2, 6)
14. np 矩陣找到 每行中最小值 所在的位置
a = np.array([[2, 5, 7, 8, 9, 89], [6, 7, 5, 4, 6, 4]])
b = np.argmin(a, axis=1)
print(b)
[0 3]
13. np 矩陣中的 log
函數(shù)
print(np.log(10)) # 自然對(duì)數(shù)
print(np.log2(10))
print(np.log10(10))
2.302585092994046
3.321928094887362
1.0
12. np 矩陣從小到大排列 輸出其在原始矩陣的 idx np.argsort
y = np.random.permutation(10)
print(y)
sorted_idx = np.argsort(y)
print(sorted_idx)
[8 2 5 6 7 9 4 1 3 0]
[9 7 1 8 6 2 3 4 0 5]
11. np 矩陣眾數(shù)計(jì)算 scipy.stats.mode
from scipy import stats
a = np.array([[6, 8, 3, 0],
[3, 2, 1, 7],
[8, 1, 8, 4],
[5, 3, 0, 5],
[4, 7, 5, 9]])
stats.mode(a) # 默認(rèn)沿行比較
ModeResult(mode=array([[3, 1, 0, 0]]), count=array([[1, 1, 1, 1]]))
stats.mode(a)
默認(rèn) axis = 0吞鸭,沿行比較,相當(dāng)于是將每一列拿出來比較覆糟,取出頻數(shù)最大的值刻剥,如果頻數(shù)一樣,就選這些數(shù)中數(shù)值最小的滩字。
stats.mode(a, axis=1) # 沿列比較透敌,比較每一行種...
ModeResult(mode=array([[0],
[1],
[8],
[5],
[4]]), count=array([[1],
[1],
[2],
[2],
[1]]))
也可以得到全局中頻數(shù)最大的盯滚,不指定 axis 即可
stats.mode(a, axis=None)
ModeResult(mode=array([3]), count=array([3]))
10. np 做網(wǎng)格矩陣 并得到網(wǎng)格坐標(biāo)點(diǎn)
xmin, xmax = 0, 10 # 11
ymin, ymax = 0, 5 # 6
step = 1
mesh = np.meshgrid(np.arange(xmin, xmax + step, step), # 網(wǎng)格矩陣
np.arange(ymin, ymax + step, step))
mesh # 組合起來就是 網(wǎng)格坐標(biāo)點(diǎn)
兩個(gè) array,網(wǎng)格中所有點(diǎn)的 橫坐標(biāo) 和 縱坐標(biāo)
[array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]),
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
[3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
[4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]])]
組合這兩個(gè) array 就得到了所有的坐標(biāo)點(diǎn)
mesh_f = np.vstack((mesh[0].flatten(), mesh[1].flatten())).T
array([[ 0, 0],
[ 1, 0],
[ 2, 0],
[ 3, 0],
[ 4, 0],
[ 5, 0],
[ 6, 0],
[ 7, 0],
[ 8, 0],
[ 9, 0],
[10, 0],
[ 0, 1],
[ 1, 1]
...
9. 取出 np 矩陣中包含的每類數(shù)字各一個(gè) np.unique
Returns the sorted unique elements of an array.
y = np.hstack((np.array([1] * 10), np.array([0] * 10)))
print(y)
print(np.unique(y))
[1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0]
[0 1
8. 將 np 矩陣每一列 feature 都正則化到 [0, 1]
import numpy as np
a = np.arange(1, 16).reshape(3, 5).T.astype('float32')
print(a)
# 將每一列數(shù)據(jù) 都標(biāo)準(zhǔn)化到 標(biāo)準(zhǔn)正態(tài)分布 N~(0,1)
avgs = np.mean(a, axis=0)
stds = np.std(a, axis=0)
print(avgs)
print(stds)
for i in range(a.shape[1]):
a[:, i] = (a[:, i] - avgs[i]) / stds[i]
print(a)
print(np.mean(a, axis=0))
print(np.std(a, axis=0))
[[ 1. 6. 11.]
[ 2. 7. 12.]
[ 3. 8. 13.]
[ 4. 9. 14.]
[ 5. 10. 15.]]
[ 3. 8. 13.] # 正則化前的 mean
[1.4142135 1.4142135 1.4142135] # 正則化前的 std
[[-1.4142135 -1.4142135 -1.4142135 ]
[-0.70710677 -0.70710677 -0.70710677]
[ 0. 0. 0. ]
[ 0.70710677 0.70710677 0.70710677]
[ 1.4142135 1.4142135 1.4142135 ]]
[2.3841858e-08 2.3841858e-08 2.3841858e-08] # 正則化后的 mean -> 0
[0.99999994 0.99999994 0.99999994] # 正則化后的 std -> 1
使用 sklearn
庫函數(shù)進(jìn)行驗(yàn)證
from sklearn import preprocessing
b = preprocessing.scale(a)
print(b)
print(np.mean(b, axis=0))
print(np.std(b, axis=0))
[[-1.4142137e+00 -1.4142137e+00 -1.4142137e+00]
[-7.0710683e-01 -7.0710683e-01 -7.0710683e-01]
[-4.7683720e-08 -4.7683720e-08 -4.7683720e-08]
[ 7.0710683e-01 7.0710683e-01 7.0710683e-01]
[ 1.4142137e+00 1.4142137e+00 1.4142137e+00]]
[0. 0. 0.]
[1. 1. 1.]
7. 統(tǒng)計(jì)數(shù)據(jù)中滿足某個(gè)條件的數(shù)的個(gè)數(shù)酗电,并將其索引輸出
a = np.arange(1, 16).reshape((3, 5))
print(a)
b = np.where(a % 2 == 0)
print(b)
[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]]
(array([0, 0, 1, 1, 1, 2, 2], dtype=int64), array([1, 3, 0, 2, 4, 1, 3], dtype=int64))
可以看到 np.where
返回的結(jié)果中,
- 第1個(gè)array表示滿足條件的數(shù)字的行號(hào)
- 第2個(gè)array表示滿足條件的數(shù)字的列號(hào)
高維矩陣依次類推内列,可以得到任意維矩陣找出滿足條件下標(biāo)的一般算法撵术。
6. 輸出一個(gè)范圍內(nèi)所有整數(shù)的隨機(jī)序列 np.random.permutation
可用于隨機(jī)輸出樣本
a = np.random.permutation(20)
print(a)
[ 0 4 9 1 8 3 16 12 10 6 14 17 19 7 5 18 13 11 2 15]
取一個(gè)范圍內(nèi) k 個(gè)不同的隨機(jī)數(shù)
k = 10
a = np.random.permutation(500)[:k]
print(a)
[ 54 324 236 138 150 492 452 154 113 198]
5. 模擬 sigmoid 函數(shù)
將 numpy 矩陣中滿足 某一個(gè)條件,比如 >=0.5 的值置為 1话瞧,剩下的置為 0
a = np.random.rand(10)
print(a)
a[a >= 0.5] = 1 # 根據(jù) a<=0.5 返回的 bool 矩陣設(shè)置值
a[a < 0.5] = 0
print(a)
[0.21568784 0.46072737 0.06695012 0.84071791 0.99760723]
[0. 0. 0. 1. 1.]
4. 找出 np 矩陣中符合特定條件元素的下標(biāo) np.where
3. 從 numpy 矩陣中 隨機(jī)選一個(gè)數(shù)字出來 np.random.choice
a = np.random.randn(10)
print(a)
b = np.where(a > 0)[0] # where的結(jié)果是tuple嫩与,取[0]得到ndarray
print(b)
c = np.random.choice(b) # 隨機(jī)選擇一個(gè)數(shù)字
print(c)
[-0.85561201 0.40785476 -1.304088 -1.3028974 -1.08861778 -0.02982628
0.01579852 0.01123383 1.51217716 0.95912397]
[1 6 7 8 9]
7
2. numpy 矩陣求逆 np.linalg.inv
,求偽逆矩np.linalg.pinv
a = np.random.rand(30).reshape((3, 10))
b = np.linalg.inv(np.matmul(a, a.T)) # (3,10) * (10,3)
print(b)
[[ 1.67361673 -0.69118592 -0.90882621]
[-0.69118592 0.88792992 0.00396744]
[-0.90882621 0.00396744 1.12034553]]
1. numpy 得到一個(gè)這樣的矩陣變換
import numpy as np
a = np.ones((1, 5))
X = np.vstack((a, 2 * a))
X = np.vstack((X, 3 * a))
print(X)
X_t = np.vstack((X, X[1] * X[2]))
X_t = np.vstack((X_t, X[1] * X[1]))
X_t = np.vstack((X_t, X[2] * X[2]))
print(X_t)
[[1. 1. 1. 1. 1.]
[2. 2. 2. 2. 2.]
[3. 3. 3. 3. 3.]]
[[1. 1. 1. 1. 1.]
[2. 2. 2. 2. 2.]
[3. 3. 3. 3. 3.]
[6. 6. 6. 6. 6.]
[4. 4. 4. 4. 4.]
[9. 9. 9. 9. 9.]]