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]) # 老矩阵任取一点
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]) # 新矩阵取同一点
(52, 64, 4)
[169. 167. 172. 255.]
(3328, 4)
[169. 167. 172. 255.]
22. 判断两个矩阵同一位置相等元素个数
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. 注意:给矩阵中某列的某几个元素赋值,别忘了
import numpy as np
x = np.diag([2,3,4]) # 对角阵
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)) # 对角阵
print(x)
eigen_vals, eigen_vecs = np.linalg.eig(x)
print(eigen_vals)
print(eigen_vecs)
可以看出,每一列表示一个特征向量
[[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) # 默认 L,也可以设置为 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 函数(一种归一化的方法)
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 矩阵对每个元素实现 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 矩阵排序反转
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 矩阵统计整数个数 np.bincount
只能计算整数数组,将每个数字的值转化成结果数组的 idx,结果数组中每个值表示相应 idx 的元素个数。
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
函数
print(np.log(10)) # 自然对数
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 矩阵众数计算 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) # 默认沿行比较
ModeResult(mode=array([[3, 1, 0, 0]]), count=array([[1, 1, 1, 1]]))
stats.mode(a)
默认 axis = 0,沿行比较,相当于是将每一列拿出来比较,取出频数最大的值,如果频数一样,就选这些数中数值最小的。
stats.mode(a, axis=1) # 沿列比较,比较每一行种...
ModeResult(mode=array([[0],
[1],
[8],
[5],
[4]]), count=array([[1],
[1],
[2],
[2],
[1]]))
也可以得到全局中频数最大的,不指定 axis 即可
stats.mode(a, axis=None)
ModeResult(mode=array([3]), count=array([3]))
10. np 做网格矩阵 并得到网格坐标点
xmin, xmax = 0, 10 # 11
ymin, ymax = 0, 5 # 6
step = 1
mesh = np.meshgrid(np.arange(xmin, xmax + step, step), # 网格矩阵
np.arange(ymin, ymax + step, step))
mesh # 组合起来就是 网格坐标点
两个 array,网格中所有点的 横坐标 和 纵坐标
[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]])]
组合这两个 array 就得到了所有的坐标点
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 矩阵中包含的每类数字各一个 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)
# 将每一列数据 都标准化到 标准正态分布 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
库函数进行验证
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. 统计数据中满足某个条件的数的个数,并将其索引输出
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
返回的结果中,
- 第1个array表示满足条件的数字的行号
- 第2个array表示满足条件的数字的列号
高维矩阵依次类推,可以得到任意维矩阵找出满足条件下标的一般算法。
6. 输出一个范围内所有整数的随机序列 np.random.permutation
可用于随机输出样本
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]
取一个范围内 k 个不同的随机数
k = 10
a = np.random.permutation(500)[:k]
print(a)
[ 54 324 236 138 150 492 452 154 113 198]
5. 模拟 sigmoid 函数
将 numpy 矩阵中满足 某一个条件,比如 >=0.5 的值置为 1,剩下的置为 0
a = np.random.rand(10)
print(a)
a[a >= 0.5] = 1 # 根据 a<=0.5 返回的 bool 矩阵设置值
a[a < 0.5] = 0
print(a)
[0.21568784 0.46072737 0.06695012 0.84071791 0.99760723]
[0. 0. 0. 1. 1.]
4. 找出 np 矩阵中符合特定条件元素的下标 np.where
3. 从 numpy 矩阵中 随机选一个数字出来 np.random.choice
a = np.random.randn(10)
print(a)
b = np.where(a > 0)[0] # where的结果是tuple,取[0]得到ndarray
print(b)
c = np.random.choice(b) # 随机选择一个数字
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 得到一个这样的矩阵变换
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.]]