第1关:Numpy 创建数组
任务描述
本关任务:使用 Numpy
创建一个多维数组。
相关知识
为了完成本关任务,你需要掌握:创建数组。
创建数组
在 Python
中创建数组有许多的方法,这里我们使用 Numpy
中的 arange
方法快速的新建一个数组:
import numpy as np a = np.arange(5)
其中 import numpy as np
是指引入 Numpy
这个库,并取别名为 np
。之所以取别名,是为了代码编写的方便。a=np.arange(5)
是指将数值 0 1 2 3 4
赋值给 a
这个变量,这样我们就快速的创建了一个一维数组。
创建多维数组的方法是:
import numpy as np b = np.array([np.arange(6),np.arange(6)])
这里,我们使用两个 arange
方法,创建了两个 1x6
的一维数组,然后使用 numpy
的 array
方法,将两个一维数组组合成一个 2x6
的二维数组。从而达到了创建多维数组的目的。
numpy 创建的数组可以直接复制,具体代码示例如下:
import numpy as np x = [y for y in range(6)] b=np.array([x]*4)
该段代码会创建一个 4*6
的数组。
编程要求
本关的任务是,补全 Begin-End 内的代码,以实现创建一个 m*n
的多维数组的功能。具体要求如下:
- 函数接受两个参数,然后创建与之对应的的多维数组;
- 本关的测试样例参见下文。
本关设计的代码文件 cnmda.py
的代码框架如下:
# 引入numpy库 import numpy as np # 定义cnmda函数 def cnmda(m,n): ''' 创建numpy数组 参数: m:第一维的长度 n: 第二维的长度 返回值: ret: 一个numpy数组 ''' ret = 0 # 请在此添加创建多维数组的代码并赋值给ret #********** Begin *********# #********** End **********# return ret
测试说明
本关的测试过程如下:
- 平台运行
step1/cnmdatest.py
文件,并以标准输入方式提供测试输入; cnmdatest.py
文件调用cnmda
中的cnmda
方法,平台获取cnmdatest.py
的输出,然后将其与预期输出作对比,如果一致,则测试通过;否则测试失败。
以下是平台对 step1/cnmdatest.py
的测试样例:
测试输入: 5 8
;
预期输出: (5,8)
测试输入: 4 9
;
预期输出:(4,9)
运行代码
# 引入numpy库 import numpy as np # 定义cnmda函数 def cnmda(m,n): ''' 创建numpy数组 参数: m:第一维的长度 n: 第二维的长度 返回值: ret: 一个numpy数组 ''' ret = 0 # 请在此添加创建多维数组的代码并赋值给ret #********** Begin *********# b=np.arange(n); ret=np.array([b]*m) #********** End **********# return ret
第2关:Numpy 数组的基本运算
任务描述
本关任务:学会 Numpy
二维数组的一些基本操作。
相关知识
为了完成本关任务,你需要掌握:
- 向量与向量之间;
- 向量与标量之间。
Numpy
库可以直接进行一些四则运算,快速的处理两个 Numpy 数组:
a = np.array([[1,2,3],[4,5,6]]) b = np.array([[4,5,6],[1,2,3]])
向量与向量之间
- 加法
In:np.add(a,b) 或 a+b Out:array([[5, 7, 9], [5, 7, 9]])
- 减法
In:np.subtract(a,b) 或 a-b Out:array([[-3, -3, -3], [ 3, 3, 3]])
- 乘法(X乘)
In:np.multiply(a,b) 或 a * b Out:array([[ 4, 10, 18], [ 4, 10, 18]])
- 乘法(点乘)
a = np.array([[1,2,3],[4,5,6]]) b = np.array([4,5,6]) In: np.dot(a,b) Out:array([32, 77])
- 除法
a = np.array([[1,2,3],[4,5,6]]) b = np.array([[4,5,6],[1,2,3]]) In:np.divide(a,b) 或 a/b Out:array([[ 0.25, 0.4 , 0.5 ], [ 4. , 2.5 , 2. ]])
向量与标量之间
a = np.array([[1,2,3],[4,5,6]])
- 加法
In: a +1 Out:array([[2, 3, 4], [5, 6, 7]])
- 减法
In: a -1 Out:array([[0, 1, 2], [3, 4, 5]])
- 乘法
In: a*2 Out:array([[ 2, 4, 6], [ 8, 10, 12]])
- 除法
In: a/2 Out:array([[ 0.5, 1. , 1.5], [ 2. , 2.5, 3. ]])
- 求余
In:a%2 Out:array([[1, 0, 1], [0, 1, 0]])
- 矩阵转置
In:a.T Out:array([[1, 4], [2, 5], [3, 6]])
- 矩阵的逆
矩阵可逆的充要条件是矩阵满秩。
import numpy as np import numpy.linalg as lg a = np.array([[1,2,3],[4,5,6],[7,8,9]]) In:lg.inv(a) Out:array([[ 3.15251974e+15, -6.30503948e+15, 3.15251974e+15], [ -6.30503948e+15, 1.26100790e+16, -6.30503948e+15], [ 3.15251974e+15, -6.30503948e+15, 3.15251974e+15]])
编程要求
本关的任务是,补全代码,以实现向量与标量相加和相乘的的功能。具体要求如下:
- 函数接受三个参数,然后进行向量与标量之间的运算;
- 本关的测试样例参见下文;
- 本关设计的代码文件
cal.py
的代码框架如下:
# 引入numpy库 import numpy as np # 定义opeadd函数 def opeadd(m,b,n): '''实现加法 参数: m:是一个数组 b:是一个列表 n:是列表中的索引 你需要做的是 m+b[n] 返回值: ret: 一个numpy数组 ''' ret = 0 # 请在此添加 创建多维数组 的代码 并赋值给ret #********** Begin *********# #********** End **********# return ret # 定义opemul函数 def opemul(m,b,n): '''实现乘法 参数: m:是一个数组 b:是一个列表 n:是列表中的索引 你需要做的是 m+b[n] 返回值: ret: 一个numpy数组 ''' ret = 0 # 请在此添加 创建多维数组 的代码 并赋值给ret #********** Begin *********# #********** End **********# return ret
测试说明
本关的测试过程如下:
- 平台运行
step5/caltest.py
文件,并以标准输入方式提供测试输入; caltest.py
文件调用cal
中的方法,平台获取caltest.py
的输出,然后将其与预期输出作对比,如果一致,则测试通过;否则测试失败。
以下是平台对 step5/caltest.py
的测试样例:
a= np.array([[1,2,3],[4,5,6]]) b = [1,2,3]
测试输入: add
;
预期输出:
[[2 3 4] [5 6 7]]
测试输入:mul
;
预期输出:
[[ 2 4 6] [ 8 10 12]]
运行代码
# 引入numpy库 import numpy as np # 定义opeadd函数 def opeadd(m,b,n): ''' 参数: m:是一个数组 b:是一个列表 n:是列表中的索引 你需要做的是 m+b[n] 返回值: ret: 一个numpy数组 ''' ret = 0 #********** Begin *********# ret=m+b[n] #********** End **********# return ret # 定义opemul函数 def opemul(m,b,n): ''' 参数: m:是一个数组 b:是一个列表 n:是列表中的索引 你需要做的是 m*b[n] 返回值: ret: 一个numpy数组 ''' ret = 0 #********** Begin *********# ret=m*b[n] #********** End **********# return ret
第3关:Numpy 数组的切片与索引
任务描述
本关任务:从数组中选择指定的元素。
相关知识
为了完成本关任务,你需要掌握:数组的切片与索引。
数组的切片与索引
一维 Numpy
数组的切片操作与 Python
列表的切片一样。下面首先来定义数字 0``````1``````2
直到 8
的数组,然后通过指定下标 3
到7
来选择数组的部分元素,这实际上就是提取数组中值为 3
到6
的元素。
In: import numpy as np In: a = np.arange(9) In: a[3:7] Out: array([3,4,5,6])
同时用下标选择元素,下标范围从 0
到 7
,并且下标每次递增 2
,如下所示:
In: a[:7:2] Out:array([0,2,4,6])
也可以像 Python
数组一样,用负值下标来反转数组:
In: a[::-1] Out: array([8,7,6,5,4,3,2,1,0])
对于二维数组的索引,类似与 Python 数组的列表:
In: a=np.array([[1,2,3],[4,3,2]]) In: a[1][0] Out:array([4]) In:a[1,:2] #获取第1维的前2个元素 Out:array([4, 3])
编程要求
本关的任务是,补全代码,以实现 Numpy
数组的索引功能的功能。具体要求如下:
- 函数接受两个参数,然后返回切片找出的指定元素;
- 本关的测试样例参见下文;
- 本关设计的代码文件
ce.py
的代码框架如下:
# 引入numpy库 import numpy as np # 定义cnmda函数 def ce(a,m,n): ''' 参数: a:是一个Numpy数组 m:是第m维数组的索引 n:第m维数组的前n个元素的索引 返回值: ret: 一个numpy数组 ''' ret = 0 # 请在此添加切片的代码,实现找出多维数组a中第m个数组的前n个元素并赋值给ret #********** Begin *********# #********** End **********# return ret
测试说明
本关的测试过程如下:
- 平台运行
step2/cetest.py
文件,并以标准输入方式提供测试输入; cetest.py
文件调用ce
中的ce
方法,平台获取cetest.py
的输出,然后将其与预期输出作对比,如果一致,则测试通过;否则测试失败。- 预处理的数组
[[1,2,3,4,5],[7,8,9,10,11],[12,13,14,15]]
以下是平台对 step2/cetest.py
的测试样例:
测试输入:
1
;
3
;
预期输出:
[7,8,9]
测试输入:
2
;
2
;
预期输出:
[12,13]
运行代码
# 引入numpy库 import numpy as np # 定义cnmda函数 def ce(a,m,n): ''' 参数: a:是一个Numpy数组 m:是第m维数组的索引 n:第m维数组的前n个元素的索引 返回值: ret: 一个numpy数组 ''' ret = 0 # 请在此添加切片的代码,实现找出多维数组a中第m个数组的前n个元素 并赋值给ret #********** Begin *********# ret=a[m,:n] #********** End **********# return ret
第4关:Numpy 数组的堆叠
任务描述
本关任务:改变 Numpy
数组的形状。
相关知识
为了完成本关任务,你需要掌握:
- 改变数组形状;
- 数组的堆叠。
使用Numpy
,我们可以方便的更改数组的形状,比如使用reshape()、ravel()、flatten()、transpose()
函数等。
具体的使用如下:
改变数组形状
reshape()
import numpy as np In: b = np.arange(24).reshape(2,3,4) In: b Out: array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]])
ravel()
拆解,将多维数组变成一维数组。
In: b.ravel() Out: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])
flatten()
拉直,其功能与 ravel() 相同,但是 flatten() 返回的是真实的数组,需要分配新的内存空间,而 ravel() 仅仅是改变视图。
In: b.flatten() Out: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])
shape()
使用元组改变数组形状。
In: b.shape = (6,4) In: b out: array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]])
transpose()
转置。
In: b.transpose() Out: array([[ 0, 4, 8, 12, 16, 20], [ 1, 5, 9, 13, 17, 21], [ 2, 6, 10, 14, 18, 22], [ 3, 7, 11, 15, 19, 23]])
数组的堆叠
从深度看,数组既可以横向叠放,也可以竖向叠放。因此,我们我们对数组进行堆叠,Numpy 数组对堆叠包含以下几个函数:
首先,创建两个数组。
In: a = np.arange(9).reshape(3,3) In: a Out: array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) In: b = a*2 In: b Out: array([[ 0, 2, 4], [ 6, 8, 10], [12, 14, 16]])
hstack()
水平叠加。
In: np.hstack((a,b)) # 注意 这里是两层括号 Out: array([[ 0, 1, 2, 0, 2, 4], [ 3, 4, 5, 6, 8, 10], [ 6, 7, 8, 12, 14, 16]])
vstack()
垂直叠加。
In: np.vstack((a,b)) Out:array([[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], [ 0, 2, 4], [ 6, 8, 10], [12, 14, 16]])
dstack()
深度叠加。
In: np.dstack((a,b)) Out: array([[[ 0, 0], [ 1, 2], [ 2, 4]], [[ 3, 6], [ 4, 8], [ 5, 10]], [[ 6, 12], [ 7, 14], [ 8, 16]]])
编程要求
本关的任务是,补全代码,分别实现 Numpy
数组的垂直叠加、水平叠加、深度叠加。具体要求如下:
- 函数接受两个参数,然后将两个参数进行叠加;
- 本关的测试样例参见下文;
- 本关设计的代码文件
manipulation.py
的代码框架如下:
# 引入numpy库 import numpy as np # 定义varray函数 def varray(m,n): ''' 参数: m:是第一个数组 n:是第二个数组 返回值: ret: 一个numpy数组 ''' ret = 0 # 请在此添加代码实现数组的垂直叠加 并赋值给ret #********** Begin *********# #********** End **********# return ret # 定义darray函数 def darray(m,n): ''' 参数: m:是第一个数组 n:是第二个数组 返回值: ret: 一个numpy数组 ''' ret = 0 # 请在此添加代码实现数组的深度叠加并赋值给ret #********** Begin *********# #********** End **********# return ret # 定义harray函数 def harray(m,n): ''' 参数: m:是第一个数组 n:是第二个数组 返回值: ret: 一个numpy数组 ''' ret = 0 # 请在此添加代码实现数组的水平叠加并赋值给ret #********** Begin *********# #********** End **********# return ret
测试说明
本关的测试过程如下:
- 平台运行
step3/manipulationtest.py
文件,并以标准输入方式提供测试输入; manipulationtest.py
文件调用manipulation
中的三个方法,平台获取manipulationtest.py
的输出,然后将其与预期输出作对比,如果一致,则测试通过;否则测试失败。- 预处理数组:
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[3,4,5],[7,8,9]])
以下是平台对 step3/manipulationtest.py
的测试样例:
测试输入: v
;
预期输出:
[[1 2 3] [4 5 6] [3 4 5] [7 8 9]]
测试输入: d
;
预期输出:
[[[1 3] [2 4] [3 5]] [[4 7] [5 8] [6 9]]]
运行代码
# 引入numpy库 import numpy as np # 定义varray函数 def varray(m,n): ''' 参数: m:是第一个数组 n:是第二个数组 返回值: ret: 一个numpy数组 ''' ret = 0 # 请在此添加代码实现数组的垂直叠加并赋值给ret #********** Begin *********# ret=np.vstack((m,n)) #********** End **********# return ret # 定义darray函数 def darray(m,n): ''' 参数: m:是第一个数组 n:是第二个数组 返回值: ret: 一个numpy数组 ''' ret = 0 # 请在此添加代码实现数组的深度叠加并赋值给ret #********** Begin *********# ret=np.dstack((m,n)) #********** End **********# return ret # 定义harray函数 def harray(m,n): ''' 参数: m:是第一个数组 n:是第二个数组 返回值: ret: 一个numpy数组 ''' ret = 0 # 请在此添加代码实现数组的水平叠加并赋值给ret #********** Begin *********# ret=np.hstack((m,n)) #********** End **********# return ret
第5关:Numpy 的拆分
任务描述
本关任务:对 Numpy
数组进行拆分。
相关知识
为了完成本关任务,你需要掌握:拆分数组。
使用 Numpy
,我们可以方便的对数组进行拆分,比如使用 hsplit()、vsplit()、dsplit()、split()
函数等。
拆分数组
准备数组。
import numpy as np In: a= np.arange(9).reshape(3,3) In: a Out: array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
hsplit()
横向拆分。
In: np.hsplit(a,3) Out:[array([[0],[3], [6]]), . array([[1], [4],[7]]), array([[2],[5], [8]])]
vsplit()
纵向拆分。
In: np.vsplit(a,3) Out: [array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
dsplit()
深度拆分。
深度拆分要求数组的秩大于等于 3
。
c= np.arange(27).reshape(3,3,3) In: np.dsplit(c,3) Out:[array([[[ 0], [ 3], [ 6]], [[ 9], [12], [15]], [[18], [21], [24]]]), array([[[ 1], [ 4], [ 7]], [[10], [13], [16]], [[19], [22], [25]]]), array([[[ 2], [ 5], [ 8]], [[11], [14], [17]], [[20], [23], [26]]])]
编程要求
本关的任务是,补全代码,分别实现 Numpy 数组的纵向拆分、横向拆分、深度拆分。具体要求如下:
- 函数接受一个参数,然后将数组进行拆分;
- 本关的测试样例参见下文;
- 本关设计的代码文件
splitarray.py
的代码框架如下:
# 引入numpy库 import numpy as np # 定义varray函数 def vsarray(m,n): ''' 参数: m:是第一个数组 n:是需要拆分到的维度 返回值: ret: 一个numpy数组 ''' ret = 0 # 请在此添加代码实现数组的纵向拆分并赋值给ret #********** Begin *********# #********** End **********# return ret # 定义hsarray函数 def hsarray(m,n): ''' 参数: m:是第一个数组 n:是需要拆分到的维度 返回值: ret: 一个numpy数组 ''' ret = 0 # 请在此添加代码实现数组的水平拆分并赋值给ret #********** Begin *********# #********** End **********# return ret # 定义dsarray函数 def dsarray(m,n): ''' 参数: m:是第一个数组 n:是需要拆分到的维度 返回值: ret: 一个numpy数组 ''' ret = 0 # 请在此添加代码实现数组的深度拆分并赋值给ret #********** Begin *********# #********** End **********# return ret
测试说明
本关的测试过程如下:
- 平台运行
step5/splitarraytest.py
文件,并以标准输入方式提供测试输入;
-splitarraytest.py
文件调用 splitarray
中的三个方法方法,平台获取 splitarraytest.py
的输出,然后将其与预期输出作对比,如果一致,则测试通过;否则测试失败。
- 预处理数组:
a= np.arange(9).reshape(3,3)
c = np.arange(27).reshape(3,3,3)
以下是平台对 step4/splitarraytest.py
的测试样例:
测试输入: v
;
预期输出: [array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
测试输入: h
;
预期输出: [array([[0],[3],[6]]), array([[1],[4],[7]]), array([[2],[5],[8]])]
运行代码
# 引入numpy库 import numpy as np # 定义varray函数 def vsarray(m,n): ''' 参数: m:是第一个数组 n:是需要拆分到的维度 返回值: ret: 一个numpy数组 ''' ret = 0 # 请在此添加代码实现数组的纵向拆分并赋值给ret #********** Begin *********# ret=np.vsplit(m,n) #********** End **********# return ret # 定义darray函数 def dsarray(m,n): ''' 参数: m:是第一个数组 n:是需要拆分到的维度 返回值: ret: 一个numpy数组 ''' ret = 0 # 请在此添加代码实现数组的深度拆分并赋值给ret #********** Begin *********# ret=np.dsplit(m,n) #********** End **********# return ret # 定义harray函数 def hsarray(m,n): ''' 参数: m:是第一个数组 n:是需要拆分到的维度 返回值: ret: 一个numpy数组 ''' ret = 0 # 请在此添加代码实现数组的水平拆分并赋值给ret #********** Begin *********# ret=np.hsplit(m,n) #********** End **********# return ret