@R星校长
第5
关:索引与切片
索引
ndarray
的索引其实和python
的list
的索引极为相似。元素的索引从0
开始。代码如下:
import numpy as np
# a中有4个元素,那么这些元素的索引分别为0,1,2,3
a = np.array([2, 15, 3, 7])
# 打印第2个元素
# 索引1表示的是a中的第2个元素
# 结果为15
print(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列的元素
# 结果为5
print(b[1][1])
遍历
ndarray
的遍历方式与python
的list
的遍历方式也极为相似,示例代码如下:
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]
。
切片示例代码如下:
import numpy as np
# a中有4个元素,那么这些元素的索引分别为0,1,2,3
a = np.array([2, 15, 3, 7])
'''
将索引从1开始到最后的所有元素切片出来并打印
结果为[15 3 7]
'''
print(a[1:])
'''
将从倒数第2个开始到最后的所有元素切片出来并打印
结果为[3 7]
'''
print(a[-2:])
'''
将所有元素倒序切片并打印
结果为[ 7 3 15 2]
'''
print(a[::-1])
# b是个2行3列的二维数组
b = np.array([[1, 2, 3], [4, 5, 6]])
'''
将第2行的第2列到第3列的所有元素切片并打印
结果为[[5 6]]
'''
print(b[1:, 1:3])
'''
将第2列到第3列的所有元素切片并打印
结果为[[2 3]
[5 6]]
'''
print(b[:, 1:3])
编程要求
在图像处理中,我们通常会将我们感兴趣的区域提取出来再进行处理,而这个感兴趣区域成为ROI
(Region Of Interest
)。本关的任务是根据提示,在右侧编辑器Begin-End
处补充代码,根据测试用例的输入将ROI
的提取并返回(ROI
是一个矩阵)。
- 具体要求请参见后续测试样例。
请先仔细阅读右侧上部代码编辑区内给出的代码框架,再开始你的编程工作!
测试说明
平台会对你编写的代码进行测试。你只需按要求完成get_roi(data, x, y, w, h)
函数即可。其中:
data
:待提取ROI
的原始图像数据(其实就是个二维数组),类型为ndarray
;x
:ROI
的左上角顶点的行索引,类型为int
;y
:ROI
的左上角顶点的列索引,类型为int
;w
:ROI
的宽,类型为int
;h
:ROI
的高,类型为int
。
测试用例是一个字典,字典中image
部分表示原始图像的像素数据,x
部分表示ROI
的左上角顶点的行索引,y
部分表示ROI
的左上角顶点的列索引,w
部分表示ROI
的宽,h
部分表示ROI
的高。
测试输入:
{
'image':[[1, 2, 255, 255, 0], [255, 255, 0, 0, 3]], 'x':0, 'y':1, 'w':2, 'h':1}
预期输出:
[[ 2 255 255] [255 0 0]]
开始你的任务吧,祝你成功!
import numpy as np
def get_roi(data, x, y, w, h):
'''
提取data中左上角顶点坐标为(x, y)宽为w高为h的ROI
:param data: 二维数组,类型为ndarray
:param x: ROI左上角顶点的行索引,类型为int
:param y: ROI左上角顶点的列索引,类型为int
:param w: ROI的宽,类型为int
:param h: ROI的高,类型为int
:return: ROI,类型为ndarray
'''
#********* Begin *********#
return data[x:x+h+1, y:y+w+1]
#********* End *********#
题目意思描述太生涩了,让我没看懂含义自己用print(np.array(data[0][1:4]))
这类的方法去试了很多遍。