数据分析与可视化 实践基础练习一(NumPy)


一、Numpy相关函数或属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
1. np.array() # 可用于创建n维数组      
2. np.arange(n) # 创建递增数组,也可指定起始和终止元素的范围(默认0到n-1)
3. np.ones(shape) # 创建全1数组,可自定义数组的尺寸(形状)

4. np.zeros(shape) # 创建全0数组,可自定义尺寸
5. np.full(shape,val) # 创建多维尺寸数组,val值可指定元素值
6. np.eye(n) # 创建一个n阶的单位方阵,对角线上全为1,其余为0

7. np.diag(n) # 以一维数组的返回方阵的对角线上元素
# 对于一维数组会返回方阵(对角线上为一维元素值,其余元素为0)

8. np.linspace() # 创建等差一维数组
# 返回介于某个区间等间距分布的数,最后1个参数表示输出元素的总个数

9. np.logspace() # 创建等比一维数组

10. np.random.randint() # 创建含起始和终止点的的整型数组,其参数size可自定义尺寸
11. .reshape(shape) # 重塑数组的尺寸(多维)原数组不变,利用数组元素个数size唯一
12. .resize(shape) # 重塑数组的尺寸,会修改原数组

13. .swapaxes(ax1,ax2) #将数组n个维度中的2个维度进行调换
14. .flatten() # 对数组进行降维,返回折叠后的一维数组,原数组不变
15. .astype() # 强制数据类型转换,会创建新的数组(是原始数据的一个拷贝)

16. .tolist() # 数组转列表
17. np.hstack() # 横向合并
18. np.vstack() # 纵向合并

19. np.concatenate() # 参数axis = 0时按行合并
# 参数axis = 1时按列合并(等价于横向合并np.hstack())

20. np.hsplit() # 按列分隔,eg. np.hsplit(arr, 2) # 数组总是沿着第二个轴/维度分割(按列),等价于axis = 1
21. np.vsplit() # 按行分隔

22. np.split() # 对数组进指定方向的分隔
23. .tanspose() # 对数组进行转置,参数是轴编号组成的元组(行 —> 列)
24. .T # 还可利用数组的T属性来转置

二、练习题目

基础题:

1、创建一个元素为从10到49的ndarray对象D1;

2、将D1的所有元素位置反转;

3、使用np.random.random创建一个10 x 10的ndarray对象,并打印出最大最小元素;

4、创建一个10 x 10的ndarray对象,且矩阵边界全为1,里面全为0;

5、创建一个范围在(0,1)之间的长度为12的等差数列;

6、创建一个长度为10的随机数组并排序;

7、给定一个4维矩阵,如何得到最后两维的和?

8、如何将数组a = np.arange(10).reshape(2,-1)和数组b = np.repeat(1, 10).
reshape(2,-1)水平堆叠?

补充题:

9、有arr = np.arange(12).reshape(3,4),若定义mask = np.array([1,0,1],dtype = np.bool),则arr[mask,1] 对应的元素是?

10、有arr = np.arange(12).reshape(3,4),则arr[(0,1),(1,3)]对应的值是?

11、将数组arr中所有的奇数置为-1对应的语句是?

12、a = np.arange(8).reshape(2,4),np.hsplit(a,2)返回值是?

13、找出数组np.array([1,2,1,1,3,4, 3,1,1,2,1,1,2])中第五个1出现的位置的代码;


三、题解

(1)基础题(1 - 8)

1
2
3
4
5
# 1、创建一个元素为从10到49的ndarray对象D1;

import numpy as np
D1 = np.arange(10, 50)
print('D1:', D1)
D1: [10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49]

1
2
3
4
5
6
# 2、将D1的所有元素位置反转;

import numpy as np
D1 = np.arange(10, 50)
a = D1[: : -1] # 逆序
print('a:', a)
a: [49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26
 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10]

1
2
3
4
5
6
7
# 3、使用np.random.random创建一个10*10的ndarray对象,并打印出最大最小元素;

import numpy as np
a = np.random.random( (10, 10) )
# print('a:', a)
print('MaxValue:', a.max())
print('MinValue:', a.min())
MaxValue: 0.9627995218664797
MinValue: 0.005820752655498862

1
2
3
4
5
6
# 4、创建一个10*10的ndarray对象,且矩阵边界全为1,里面全为0;

import numpy as np
a = np.zeros( (10,10) )
a[0, : ] = a[9, : ] = a[ : , 0] = a[ : , 9] = 1 # 获取第1行、第9行、第1列、第9列的数组值将其改为1
print(a)
[[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
 [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
 [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
 [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
 [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
 [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
 [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
 [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]]

1
2
3
4
5
# 5、创建一个范围在(0,1)之间的长度为12的等差数列;

import numpy as np
a = np.linspace(0, 1, 12) # 第3个参数为元素个数,从0到1生成了12个等间隔的数
print(a)
[0.         0.09090909 0.18181818 0.27272727 0.36363636 0.45454545
 0.54545455 0.63636364 0.72727273 0.81818182 0.90909091 1.        ]

1
2
3
4
5
6
# 6、创建一个长度为10的随机数组并排序;

import numpy as np
a = np.random.random(10)
print('a:', a)
print(np.sort(a)) # 升序输出
a: [0.46602273 0.68013528 0.39960639 0.59603541 0.30224607 0.43446988
 0.84969599 0.80521228 0.6243939  0.43140521]
[0.30224607 0.39960639 0.43140521 0.43446988 0.46602273 0.59603541
 0.6243939  0.68013528 0.80521228 0.84969599]

1
2
3
4
5
6
# 7、给定一个4维矩阵,如何得到最后两维的和?

import numpy as np
a = np.ones( (1, 2, 3, 4) ) # 定义1个三维的含2个(3行4列)的全一数组
print('a:', a)
print('Sum:', a.sum(axis = (2, 3)) ) # axis=(2, 3)) 表示对第3个和第4个维度求和
a: [[[[1. 1. 1. 1.]
   [1. 1. 1. 1.]
   [1. 1. 1. 1.]]

  [[1. 1. 1. 1.]
   [1. 1. 1. 1.]
   [1. 1. 1. 1.]]]]
Sum: [[12. 12.]]

1
2
3
4
5
6
7
8
9
10
# 8、如何将数组a = np.arange(10).reshape(2,-1)和数组b = np.repeat(1, 10).reshape(2,-1)水平堆叠?

import numpy as np
a = np.arange(10).reshape(2, -1)
print('a:', a)
b = np.repeat(1, 10).reshape(2, -1)
print('b:', b)

c= np.hstack( (a, b) ) # np.hstack是横向合并 或用 np.concatenate((a, b), axis = 1) 按列合并
print('c:', c)
1
2
3
4
5
6
a: [[0 1 2 3 4]
[5 6 7 8 9]]
b: [[1 1 1 1 1]
[1 1 1 1 1]]
c: [[0 1 2 3 4 1 1 1 1 1]
[5 6 7 8 9 1 1 1 1 1]]

(2)补充题型(9 - 13)


1
2
3
4
5
6
# 9、有arr = np.arange(12).reshape(3,4),若定义mask = np.array([1,0,1],dtype = np.bool),则arr[mask,1] 对应的元素是

import numpy as np
a = np.arange(12).reshape(3, 4)
mask = np.array([1,0,1],dtype = np.bool) # mask是布尔数组表示的值为Ture,False,True
print(a[mask,1]) # 取出第1行和第3行的第2列元素
1
[1 9]

1
2
3
4
5
6
# 10、有arr = np.arange(12).reshape(3,4),则arr[(0,1),(1,3)]对应的值是

import numpy as np
a = np.arange(12).reshape(3, 4)
print(a[(0,1),(1,3)]) # 会得到4个值,对应到a[0,1] = 1, a[1,3] = 7, a[(0, 1),(1, 3)]的值是[1, 7]
print(a[1:2,(0, 3)]) # 输出第二行,与第一列和四列相交处元素的值
1
2
[1 7]
[[4 7]]

1
2
3
4
5
6
7
# 11、将数组a中所有的奇数置为-1对应的语句是

import numpy as np
a = np.random.randint(1,12, (3,4) )
print(a)
a[a % 2 != 0] = -1
print(a)
1
2
3
4
5
6
[[ 8 10  9  2]
[ 5 6 4 8]
[10 6 7 7]]
[[ 8 10 -1 2]
[-1 6 4 8]
[10 6 -1 -1]]

1
2
3
4
5
6
# 12、a = np.arange(8).reshape(2,4),np.hsplit(a,2)返回值是

import numpy as np
a = np.arange(8).reshape(2,4)
print(a)
print(np.hsplit(a, 2)) # 对数组按列进行分割,将一个数组等分。数组总是沿着第二个轴分割(按列)
1
2
3
4
5
6
[[0 1 2 3]
[4 5 6 7]]
[array([[0, 1],
[4, 5]]),
array([[2, 3],
[6, 7]])]

1
2
3
4
5
6
# 13、找出数组np.array([1,2,1,1,3,4,3,1,1,2,1,1,2])中第五个1出现的位置的代码。

import numpy as np
a = np.array([1,2,1,1,3,4,3,1,1,2,1,1,2])
index = np.where(a == 1)[0][4] # np.where函数返回的是一个元组,包含所有符合条件的元素的行索引和列索引
print(index)
1
8

四、参考资料

视频:

【一个10分钟的numpy入门教程】

【Python Numpy入门精华】

文章:

NumPy官方文档

Numpy经典题目简答

Numpy使用sort和argsort函数进行排序

Python3:numpy模块中的argsort()函数