任务描述
本关的小目标是,使用 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 *********#
x=[y for y in range(n)];
ret=np.array([x]*m);
#********** End **********#
return ret
任务描述
本关的小目标是,学会Numpy
二维数组的一些基本操作。
相关知识
Numpy
库可以直接进行一些四则运算,快速的处理两个Numpy
数组:
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[4,5,6],[1,2,3]])
向量与向量之间
1.加法
In:np.add(a,b) 或 a+b
Out:array([[5, 7, 9],
[5, 7, 9]])
2.减法
In:np.subtract(a,b) 或 a-b
Out:array([[-3, -3, -3],
[ 3, 3, 3]])
3.乘法(X乘)
In:np.multiply(a,b) 或 a * b
Out:array([[ 4, 10, 18],
[ 4, 10, 18]])
4.乘法(点乘)
a = np.array([[1,2,3],[4,5,6]])
b = np.array([4,5,6])
In: np.dot(a,b)
Out:array([32, 77])
5.除法
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]])
1.加法
In: a +1
Out:array([[2, 3, 4],
[5, 6, 7]])
2.减法
In: a -1
Out:array([[0, 1, 2],
[3, 4, 5]])
3.乘法
In: a*2
Out:array([[ 2, 4, 6],
[ 8, 10, 12]])
4.除法
In: a/2
Out:array([[ 0.5, 1. , 1.5],
[ 2. , 2.5, 3. ]])
5.求余
In:a%2
Out:array([[1, 0, 1],
[0, 1, 0]])
6.矩阵转置
In:a.T
Out:array([[1, 4],
[2, 5],
[3, 6]])
7.矩阵的逆
矩阵可逆的充要条件是矩阵满秩。
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]])
编程要求
本关的任务是,补全右侧编辑器中 Begin-End
区间的代码,以实现向量与标量相加和相乘的的功能。具体要求如下:
函数接受三个参数,然后进行向量与标量之间的运算;
本关的测试样例参见下文;
本关设计的代码文件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
任务描述
本关的小目标是,从数组中选择指定的元素。
相关知识
一维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])
编程要求
本关的任务是,右侧编辑器中 Begin-End
区间的代码,以实现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
直接上代码:
# 引入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
代码:
# 引入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