Numpy科学计算
第1关:数组创建
#### 相关知识
在 Python 中创建数组有许多的方法,这里我们使用 Numpy 中的`arange`方法快速的新建一个数组:
```Plain Text
import numpy as npa = np.arange(5)
```
其中`import numpy as np`是指引入`Numpy`这个库,并取别名为`np`。之所以取别名,是为了代码编写的方便。`a=np.arange(5)`是指将数值`0 1 2 3 4`赋值给`a`这个变量,这样我们就快速的创建了一个一维数组。
创建多维数组的方法是:
```Plain Text
import numpy as npb = np.array([np.arange(6),np.arange(6)])
```
这里,我们使用两个`arange`方法,创建了两个`1x6`的一维数组,然后使用`numpy`的`array`方法,将两个一维数组组合成一个`2x6`的二维数组。从而达到了创建多维数组的目的。
`numpy`创建的数组可以直接复制,具体代码示例如下:
```Plain Text
import numpy as npx = [y for y in range(6)]b=np.array([x]*4)
```
该段代码会创建一个`4*6`的数组。
#### 编程要求
本关的任务是,补全右侧编辑器中 `Begin-End` 区间的代码,以实现创建一个`m*n`的多维数组的功能。具体要求如下:
- 函数接受两个参数,然后创建与之对应的的多维数组;
- 本关的测试样例参见下文。
本关设计的代码文件`cnmda.py`的代码框架如下:
```Plain Text
# 引入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`的输出,然后将其与预期输出作对比,如果一致,则测试通过;否则测试失败。
# 引入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关:切片索引
#### 相关知识
为了完成本关任务,你需要掌握:
- 索引;
- 遍历;
- 切片。
##### 索引
`ndarray`的索引其实和`python`的`list`的索引极为相似。元素的索引从`0`开始。代码如下:
```Plain Text
import numpy as np
# a中有4个元素,那么这些元素的索引分别为0,1,2,3
a = np.array([2, 15, 3, 7])
# 打印第2个元素
# 索引1表示的是a中的第2个元素
# 结果为15print(a[1])
# b是个2行3列的二维数组
b = np.array([[1, 2, 3], [4, 5, 6]])
# 打印b中的第1行
# 总共就2行,所以行的索引分别为0,1
# 结果为[1, 2, 3]print(b[0])
# 打印b中的第2行第2列的元素
# 结果为5print(b[1][1])
```
##### 遍历
`ndarray`的遍历方式与`python`的`list`的遍历方式也极为相似,示例代码如下:
```Plain Text
import numpy as np
a = np.array([2, 15, 3, 7])
# 使用for循环将a中的元素取出来后打印
for element in a:
print(element)
# 根据索引遍历a中的元素并打印
for idx in range(len(a)):
print(a[idx])
# b是个2行3列的二维数组
b = np.array([[1, 2, 3], [4, 5, 6]])
# 将b展成一维数组后遍历并打印
for element in b.flat:
print(element)
# 根据索引遍历b中的元素并打印
for i in range(len(b)):
for j in range(len(b[0])):
print(b[i][j])
```
##### 切片
`ndarray`的切片方式与`python`的`list`的遍历方式也极为相似,对切片不熟的同学也不用慌,套路很简单,就是用索引。
假设想要将下图中紫色部分切片出来,就需要确定行的范围和列的范围。由于紫色部分行的范围是`0`到`2`,所以切片时行的索引范围是`0:3`(**索引范围是左闭右开**);又由于紫色部分列的范围也是`0`到`2`,所以切片时列的索引范围也是`0:3`(**索引范围是左闭右开**)。最后把行和列的索引范围整合起来就是`[0:3, 0:3]`(**`,`左边是行的索引范围**)。当然有时为了方便,`0`可以省略,也就是`[:3, :3]`。

切片示例代码如下:
#### 编程要求
在图像处理中,我们通常会将我们感兴趣的区域提取出来再进行处理,而这个感兴趣区域成为`ROI`(`Region Of Interest`)。本关的任务是根据提示,在右侧编辑器`Begin-End`处补充代码,根据测试用例的输入将`ROI`的提取并返回(`ROI`是一个矩阵)。
- 具体要求请参见后续测试样例。
请先仔细阅读右侧上部代码编辑区内给出的代码框架,再开始你的编程工作!
#### 测试说明
平台会对你编写的代码进行测试。你只需按要求完成`get_roi(data, x, y, w, h)`函数即可。其中:
- `data`:待提取`ROI`的原始图像数据(其实就是个二维数组),类型为`ndarray`;
- `x`: `ROI`的左上角顶

本教程涵盖Numpy数组的创建、索引、基本运算及高级功能如ufunc的应用,通过实践练习帮助读者掌握Numpy的基本操作。
最低0.47元/天 解锁文章
3722

被折叠的 条评论
为什么被折叠?



