numpy 使用

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

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.]]

你可能感兴趣的:(numpy 使用)