/images/Eevee.png

文章内容若有侵权,请联系删除🌹

Numpy100

1. 导入库并重命名 (★☆☆)

1
import numpy as np

2. 打印版本和配置信息 (★☆☆)

1
2
print(np.__version__)
np.show_config()

3. 创建一个大小为 10 的空向量 (★☆☆)

1
2
Z = np.zeros(10)
print(Z)

4. 寻找数组的内存大小 (★☆☆)

1
2
Z = np.zeros((10,10))
print("%d bytes" % (Z.size * Z.itemsize))

5. 通过命令行的方式获取 add 操作的说明文档 (★☆☆)

1
%run `python -c "import numpy; numpy.info(numpy.add)"`

6. 创建一个大小为 10 的空向量,并为第 5 个值赋值为 1 (★☆☆)

1
2
3
Z = np.zeros(10)
Z[4] = 1
print(Z)

7. 创建一个值的范围为从 10 到 49 的向量 (★☆☆)

1
2
Z = np.arange(10,50)
print(Z)

8. 翻转一个向量 (★☆☆)

1
2
3
Z = np.arange(50)
Z = Z[::-1]
print(Z)

9. 创建一个 3x3 的矩阵,值的范围为 0 到 8 (★☆☆)

1
2
Z = np.arange(9).reshape(3, 3)
print(Z)

10. 寻找 [1,2,0,0,4,0] 中非零元素的下标 (★☆☆)

1
2
nz = np.nonzero([1,2,0,0,4,0])
print(nz)

11. 创建一个 3x3 的单位矩阵 (★☆☆)

1
2
Z = np.eye(3)
print(Z)

12. 创建一个 3x3x3 的随机数组 (★☆☆)

1
2
Z = np.random.random((3,3,3))
print(Z)

13. 创建一个 10x10 的随机数组,并寻找其最小最大值 (★☆☆)

1
2
3
Z = np.random.random((10,10))
Zmin, Zmax = Z.min(), Z.max()
print(Zmin, Zmax)

14. 创建一个大小为 30 的随机向量,并寻找其平均值 (★☆☆)

1
2
3
Z = np.random.random(30)
m = Z.mean()
print(m)

15. 创建一个二维数组,外围是 1,中间均为 0 (★☆☆)

1
2
3
Z = np.ones((10,10))
Z[1:-1,1:-1] = 0
print(Z)

16. 给一个数组的外围增加一圈 0 (★☆☆)

1
2
3
4
5
6
7
8
Z = np.ones((5,5))
Z = np.pad(Z, pad_width=1, mode='constant', constant_values=0)
print(Z)

# Using fancy indexing
Z[:, [0, -1]] = 0
Z[[0, -1], :] = 0
print(Z)

17. 以下表达式的结果 (★☆☆)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
0 * np.nan
# nan

np.nan == np.nan
# False

np.inf > np.nan
# False

np.nan - np.nan
# nan

np.nan in set([np.nan])
# True

0.3 == 3 * 0.1
# False

18. 创建一个 5x5 的矩阵,对角线以下的元素为 1,2,3,4 (★☆☆)

1
2
3
4
5
6
7
8
Z = np.diag(1+np.arange(4), k=-1)
print(Z)

# [[0 0 0 0 0]
#  [1 0 0 0 0]
#  [0 2 0 0 0]
#  [0 0 3 0 0]
#  [0 0 0 4 0]]

19. 创建一个 8x8 的矩阵,并用棋盘图案填充 (★☆☆)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Z = np.zeros((8,8),dtype=int)
Z[1::2,::2] = 1
Z[::2,1::2] = 1
print(Z)

# [[0 1 0 1 0 1 0 1]
#  [1 0 1 0 1 0 1 0]
#  [0 1 0 1 0 1 0 1]
#  [1 0 1 0 1 0 1 0]
#  [0 1 0 1 0 1 0 1]
#  [1 0 1 0 1 0 1 0]
#  [0 1 0 1 0 1 0 1]
#  [1 0 1 0 1 0 1 0]]

20. 考虑一个 6x7x8 形状数组,第 100 个元素的索引 (x,y,z) 是多少? (★☆☆)

1
2
print(np.unravel_index(99, (6,7,8)))
# (np.int64(1), np.int64(5), np.int64(3))

21. 使用 tile 函数创建一个 8x8 的棋盘矩阵 (★☆☆)

1
2
3
# 通过重复 [[0,1],[1,0]] 矩阵来构造
Z = np.tile(np.array([[0,1],[1,0]]), (4,4))
print(Z)

22. 归一化一个 5x5 随机矩阵 (★☆☆)

1
2
3
4
Z = np.random.random((5,5))
# 直接减去均值,再除以标准差
Z = (Z-np.mean(Z)) / (np.std(Z))
print(Z)

23. 创建一个自定义 dtype,将颜色描述为四个无符号字节 (RGBA) (★☆☆)

1
2
3
4
color = np.dtype([("r", np.ubyte),
                  ("g", np.ubyte),
                  ("b", np.ubyte),
                  ("a", np.ubyte)])

24. 5x3 矩阵乘以 3x2 矩阵(实矩阵乘积) (★☆☆)

1
2
3
4
5
6
Z = np.dot(np.ones((5,3)), np.ones((3,2)))
print(Z)

# Alternative solution, in Python 3.5 and above
Z = np.ones((5,3)) @ np.ones((3,2))
print(Z)

25. 假设有一个 1 维数组,将介于 3 到 8 之间的所有元素在原地取反 (★☆☆)

1
2
3
4
5
# Author: Evgeni Burovski

Z = np.arange(11)
Z[(3 < Z) & (Z < 8)] *= -1
print(Z)

26. 以下程序的输出 (★☆☆)

1
2
3
4
5
6
7
8
# Author: Jake VanderPlas

print(sum(range(5),-1))
from numpy import *
print(sum(range(5),-1))

# 9,未导入 numpy 的 sum 之前,0+1+2+3+4-1=9
# 10,导入之后,-1 表示的是在某个轴上求和

27. 考虑一个整数向量 Z,下列哪个表达式是合法的? (★☆☆)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
Z = np.array([1,2,3])
# 数组的元素级幂运算
Z**Z
# 位运算,先左移再右移,作用到每一个元素上
2 << Z >> 2
Z <- Z
# 复数单位 1j 乘以数组的每个元素
1j*Z
Z/1/1
Z<Z>Z

# [ 1  4 27]
# [1 2 4]
# [False False False]
# [0.+1.j 0.+2.j 0.+3.j]
# [1. 2. 3.]
# 报错

28. 以下表达式的结果 (★☆☆)

1
2
3
4
5
6
7
np.array(0) / np.array(0)
np.array(0) // np.array(0)
np.array([np.nan]).astype(int).astype(float)

# nan
# 0
# [-9.22337204e+18]

29. 如何根据数组元素的符号来决定是向上取整还是向下取整 (★☆☆)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Author: Charles R Harris

Z = np.random.uniform(-10,+10,10)
print(np.copysign(np.ceil(np.abs(Z)), Z))
# 先对绝对值向上取整
# 再通过 copysign() 函数将符号设置为 Z 中对应元素的符号

# More readable but less efficient
print(np.where(Z>0, np.ceil(Z), np.floor(Z)))
# 通过 where 判断,如果元素大于零则向上取整,否则向下取整

30. 如何找到两个数组之间的共同值? (★☆☆)

1
2
3
Z1 = np.random.randint(0,10,10)
Z2 = np.random.randint(0,10,10)
print(np.intersect1d(Z1, Z2))

31. 如何忽略所有 numpy 警告?(不推荐) (★☆☆)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Suicide mode on
defaults = np.seterr(all="ignore")
Z = np.ones(1) / 0

# Back to sanity
_ = np.seterr(**defaults)

# Equivalently with a context manager
with np.errstate(all="ignore"):
    np.arange(3) / 0

32. 以下表达式是否正确? (★☆☆)

1
2
np.sqrt(-1) == np.emath.sqrt(-1)
# False

33. 如何获取昨天、今天和明天的日期? (★☆☆)

1
2
3
yesterday = np.datetime64('today') - np.timedelta64(1)
today     = np.datetime64('today')
tomorrow  = np.datetime64('today') + np.timedelta64(1)

34. 如何获取 2016 年 7 月对应的所有日期? (★★☆)

1
2
Z = np.arange('2016-07', '2016-08', dtype='datetime64[D]')
print(Z)

35. 如何计算 ((A+B)*(-A/2)),没有生成额外副本,就地计算 (★★☆)

1
2
3
4
5
6
A = np.ones(3)*1
B = np.ones(3)*2
np.add(A, B, out=B)
np.divide(A, 2, out=A)
np.negative(A, out=A)
np.multiply(A, B, out=A)

36. 使用 4 种不同的方法提取随机正数数组的整数部分 (★★☆)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Z = np.random.uniform(0,10,10)

# Z%1 获取小数部分
print(Z - Z%1)
# Z 整除 1
print(Z // 1)
# Z 向下取整
print(np.floor(Z))
# 直接转为 int 类型
print(Z.astype(int))
# 截断 truncation
print(np.trunc(Z))

37. 创建一个行值从 0 到 4 的 5x5 矩阵 (★★☆)

1
2
3
4
5
6
7
8
Z = np.zeros((5,5))
Z += np.arange(5)
print(Z)

# without broadcasting
# np.tile() 函数用于重复数组
Z = np.tile(np.arange(0,5), (5,1))
print(Z)

38. 考虑一个生成 10 个整数的生成器函数,并用它来构建一个数组 (★☆☆)

1
2
3
4
5
6
7
def generate():
    for x in range(10):
        yield x


Z = np.fromiter(generate(), dtype=float, count=-1)
print(Z)

np.fromiter 函数创建一个 NumPy 数组,它从给定的迭代器中读取数据
generate() 调用生成器函数,作为迭代器传入 fromiter
dtype=float 指定生成的 NumPy 数组的数据类型为浮点数
count=-1 表示读取迭代器中的所有元素,直到迭代器耗尽

机器学习知识体系

参考资料

第一部分:数据预处理与特征工程

在应用机器学习模型之前,对原始数据进行恰当的清洗、转换和规约是至关重要的一步。本部分涵盖数据分析的基本流程及常用的预处理技术。

1.1 数据分析一般流程

一个典型的数据分析项目通常遵循以下步骤: